R语言ggplot按2016年7月起始顺序绘制月度直方图求助
解决ggplot直方图月度排序问题
嘿,我来帮你搞定这个问题!你遇到的是因子(factor)默认排序的典型问题——ggplot会按照因子水平的字母顺序来排列你的月份,但我们需要的是时间顺序。下面是具体的解决步骤:
第一步:重新指定date列的因子水平顺序
你的date列目前是因子类型,但它的水平顺序是自动生成的字母序,我们需要把它改成从2016年7月到2017年7月的时间顺序。
首先,写出你所有月份的正确时间顺序列表(注意要和数据里的标签完全一致,比如"aug 2016 "后面的空格要保留):
month_order <- c("july 2016", "aug 2016 ", "sept 2016", "oct 2016", "nov 2016", "dec 2016", "jan 2017", "feb 2017", "march 2017", "apr 2017", "may 2017", "june 2017", "july 2017")
然后重新设置af数据框中date列的因子水平:
af$date <- factor(af$date, levels = month_order)
这样date的因子水平就会按照我们指定的时间顺序排列,而非默认的字母序。
第二步:修改你的ggplot代码
现在直接用修改后的af绘图,facet_wrap就会按照时间顺序排列你的月份直方图了:
ggplot(af, aes(x=cl)) + geom_histogram(binwidth=2, color="red") + facet_wrap(~date, ncol=2, nrow=7) + scale_x_continuous(name="Length Class (mm)") + scale_y_continuous(name ="Number of Specimens")
额外小提示
如果之后你还有类似的时间序列数据,建议一开始就把日期列转换成Date类型(可以用lubridate包),这样排序会更省心:
library(lubridate) # 先清理date里的多余空格,再转成日期格式 af$date_clean <- trimws(af$date) af$date_date <- dmy(paste0("01 ", af$date_clean)) # 用转换后的日期列分面,默认就是时间顺序 ggplot(af, aes(x=cl)) + geom_histogram(binwidth=2, color="red") + facet_wrap(~date_date, ncol=2, nrow=7) + labs(x="Length Class (mm)", y="Number of Specimens")
内容的提问来源于stack exchange,提问作者Coşkun Menderes Aydın
相关产品推荐
相关产品推荐

