【问题标题】:ggplot dismisses x axis factor levelsggplot 忽略 x 轴因子水平
【发布时间】:2020-12-24 11:48:41
【问题描述】:

我有以下问题:如果我运行代码,我的 X 轴标签会由于某种未知原因松动分配的因子级别,而不是顺序:1 周,2 周变成:1 周,10 周.. . 当我使用geom_line AND geom_point:

datax <- read.csv("https://raw.githubusercontent.com/justasmundeikis/stackoverflow/main/example.csv")
df <- datax %>%
        select(2,4,5,7,8,10,11,14,15)%>%
        rename(week_nr=savaites_mirusiuju_label.en,
               county_c=apskritysLR,
               county=apskritysLR_label.en,
               age_group_c=amzius_mirusiuju,
               age_group=amzius_mirusiuju_label.en,
               sex_c=Lytis,
               sex=Lytis_label.en,
               year=LAIKOTARPIS,
               values=obsValue)%>%
        filter(age_group!="Not indicated")%>%
        mutate(week_nr=factor(week_nr,
                        levels=paste(1:53, "week")))


x <- df %>%
        filter(age_group=="25–29",
               sex_c==0,
               county_c=="00")%>%
        group_by(year, week_nr)%>%
        summarise(values=sum(values))%>%
        mutate(cat=as.factor(ifelse(year>=2020,1,0)))

ggplot(x,aes(x=week_nr, values, group=year))+
        geom_line(data = x%>%filter(cat==1), col="red")+
        geom_point(data = x%>%filter(cat==0), col="grey")+
        theme(axis.text.x = element_text(angle = 90, hjust = 1))

...但是如果我在没有geom_line的情况下运行最后一个块@

ggplot(x,aes(x=week_nr, values, group=year))+
        #geom_line(data = x%>%filter(cat==1), col="red")+
        geom_point(data = x%>%filter(cat==0), col="grey")+
        theme(axis.text.x = element_text(angle = 90, hjust = 1))

那么轴标签顺序是正确的。 我的主要目标是所有年份都有灰色点,但 2020 年除外。对于 2020 年,我想要一条红线,因此我创建了 cat 因子变量。

我该如何解决这个问题? 提前致谢

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    由于您的周数是因子而不是 1 到 53 的数字,这使得这变得更加困难(您总是可以将 x 轴设为数字并用可以解决问题的文本标记它)。无论如何,发生这种重新排序的原因是因为并非week_nr 的所有因子水平都出现在子集cat == "1" 中。未使用的因子水平被删除,这会触发重新排序。有几种方法可以解决这个问题:

    1. 添加scale_x_discrete(drop = FALSE)
    2. geom_point 调用移到geom_line 调用之前,因为用于绘制的第一个几何图形的数据集决定了使用的级别。
    ggplot(x, aes(week_nr, values, group = year)) +
      geom_line(data = x %>% filter(cat == "1"), color = "red") +
      geom_point(data = x %>% filter(cat == "0"), color = "grey") +
      theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
      scale_x_discrete(drop = FALSE)
    

    【讨论】:

      【解决方案2】:

      不确定究竟是什么问题以及幕后发生了什么......但您可以通过首先绘制geom_point 和第二个geom_line 来解决您的问题。我只能猜测原因是不是所有级别的因子week_nr 都存在于两个数据集中...

      library(dplyr)
      library(ggplot2)
      
      datax <- read.csv("https://raw.githubusercontent.com/justasmundeikis/stackoverflow/main/example.csv")
      df <- datax %>%
        select(2,4,5,7,8,10,11,14,15)%>%
        rename(week_nr=savaites_mirusiuju_label.en,
               county_c=apskritysLR,
               county=apskritysLR_label.en,
               age_group_c=amzius_mirusiuju,
               age_group=amzius_mirusiuju_label.en,
               sex_c=Lytis,
               sex=Lytis_label.en,
               year=LAIKOTARPIS,
               values=obsValue)%>%
        filter(age_group!="Not indicated") %>% 
        mutate(week_nr=factor(week_nr,
                               levels=paste(1:53, "week")))
      
      x <- df %>%
        filter(age_group=="25–29",
               sex_c==0,
               county_c=="00")%>%
        group_by(year, week_nr)%>%
        summarise(values=sum(values))%>%
        ungroup() %>% 
        mutate(cat=ifelse(year>=2020,1,0))
      #> `summarise()` regrouping output by 'year' (override with `.groups` argument)
      
      ggplot(x,aes(x=week_nr, values, group=year))+
        geom_point(data = x%>%filter(cat==0), col="grey")+
        geom_line(data = x%>%filter(cat==1), col="red")+
        theme(axis.text.x = element_text(angle = 90, hjust = 1))
      #> Warning: Removed 2 rows containing missing values (geom_point).
      

      【讨论】:

      • 是的@stefan,你在正确的轨道上。调用 geom_line 时,调用它的数据中没有第 52 周或第 53 周。这些级别被删除,这会触发重新排序。所以你可以像你一样做并切换geom_linegeom_point命令(所以所有级别都存在于第一个geom层中),或者(也许更“正确”),添加一个scale_x_discrete(drop = FALSE)到情节,这可以防止强制重新排序。如果你像我一样,你会对这种行为感到有点惊讶。
      • Hej @AllanCameron。感谢您的澄清。正如我已经知道的那样,您是一个真正的 ggplot2 向导,并且始终是启蒙的源泉。 (:圣诞快乐。S.
      猜你喜欢
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      相关资源
      最近更新 更多