【问题标题】:Reorder levels of factor by continuous months按连续月份重新排序因子水平
【发布时间】:2019-04-12 08:30:38
【问题描述】:

我有一个像这样的数据框:

数据框:

 df<- data.frame(station= as.factor(rep("a", 12)), 
            month= as.character(c("Apr", "Aug", "Dec", "Feb", "Jan", "Jul",
                                                                  "Jun", "Mar", "May", "Nov", "Oct", "Sep")), 
            mean= rnorm(12, 300, 10), sd= rnorm(12, 300, 1), season= c(rep("wet", 6), rep("dry", 6)))

我想按连续顺序重新排序月份,以便当我输入 ggplot 函数时,每个月的数据都按日历顺序出现。

尝试订购失败:

df$month<-factor(df$month, levels=c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))

我之前已经让它工作并使用以下代码来获取后续输出,但是我在此过程中删除了一些东西,并认为错误的来源是不正确的排序:

以前的输出:

p<
  ggplot(df, aes(x = month, y=mean, fill=season)) + 
  geom_bar(stat="identity", color="black", 
       position=position_dodge()) +
  geom_errorbar(aes(ymin=mean-se, ymax=mean+se), width=.2,
             position=position_dodge(.9)) 
 p +labs(x="Month", y = "Precipitation (mm)") +
  theme_bw()+
  theme(legend.title = element_blank(),legend.text=element_text(size=15),legend.position="top",title= element_text(size=20), axis.text= element_text(size=10, face = "bold"), panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
   panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  coord_flip()

我想最终再次生成这个数字(注意:为简化起见,我的示例代码只包含两个季节,而不是图像中的三个)。

【问题讨论】:

  • 是不是现在的顺序是从下到上而不是从上到下的问题?在这种情况下,您可以添加scale_x_discrete(limits = rev(levels(df$month))),如here 所示。否则,您的代码可以让我按日期排序(不过,从底部到顶部)。
  • 仅供参考,您可以使用内置变量month.abb 而不是输入"Jan", "Feb", ...

标签: r ggplot2


【解决方案1】:

你快到了。像这样的东西应该可以工作:

df<- data.frame(station= as.factor(rep("a", 12)), 
                month= as.character(c("Apr", "Aug", "Dec", "Feb", "Jan", "Jul",
                                      "Jun", "Mar", "May", "Nov", "Oct", "Sep")), 
                mean= rnorm(12, 300, 10), se= rnorm(12, 10, 1), season= c(rep("wet", 6), rep("dry", 6)))



mon <- rev(c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))

p<- ggplot(df, aes(x = factor(month, levels= mon, labels = mon), y=mean, fill=season)) + 
  geom_bar(stat="identity", color="black", position=position_dodge()) +
  geom_errorbar(aes(ymin=mean-se, ymax=mean+se), width=.2, position=position_dodge(.9)) 

p +labs(x="Month", y = "Precipitation (mm)") +
  theme_bw()+
  theme(legend.title = element_blank(),legend.text=element_text(size=15),legend.position="top",title= element_text(size=20), axis.text= element_text(size=10, face = "bold"), panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black")) + 
  coord_flip()

如果您只使用level 而不是level + label,我不确定为什么行为会有所不同。有人吗?

【讨论】:

  • 谢谢,这确实正确地订购了它们。现在唯一的问题是,如果我选择使用 `coord_flip(),顶部从 12 月开始,底部从 1 月开始。任何想法如何以这样的方式排序,以便最高值是 1 月,它会序列到 12 月,这将成为最低值?
  • 我不确定正确的方法,但快速修复将反转列表,即mon2 &lt;- rev(mon)
  • 啊哈!正确的方法是使用scale_x_reverse()
  • @Jrakru56 如果scale_x_reverse() 有效,请更新您的答案以包含该内容。
  • 嗯。看来scale_x_reverse 不是正确的方法。它不处理离散情况。所以快速修复的方式是......
猜你喜欢
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 2022-01-10
相关资源
最近更新 更多