ggplot中如何对转为因子类型的日期x轴按时间顺序排序
问题说明
绘制年月维度的统计图表时,若数据集缺失部分月份记录,直接使用日期刻度轴会出现x轴刻度间距不等的问题:
- 直接使用
scale_x_date:轴刻度按真实时间跨度分布,缺失月份的位置会留空,刻度间距不均匀 - 将日期转为因子后绘图:可以实现刻度等距展示,但因子默认按字符顺序排序,会出现时间先后顺序错乱的问题,且因子类型的离散轴无法适配
scale_x_date的日期专属配置
当前复现问题的绘图效果如下:
问题复现代码
dt <- data.frame( M_Datum = c("2018-02-05","2018-02-15","2018-02-10","2018-02-13","2017-02-05","2017-02-15","2017-02-10","2017-02-23","2020-02-25","2012-02-15","2020-02-10","2020-02-13"), Yield = c(4,47,18,10,22,50,70,120,150,400,60,78) ) dt[,1] <- as.Date(format(as.Date(dt[,1]), "%Y-%m-01")) dr <- data.frame("M_Datum"=dt$M_Datum,"Yield"=dt$Yield) mydf <- aggregate(Yield ~ M_Datum, dr, length) koka <- data.frame("M_Datum"=mydf$M_Datum,"Yiel"=mydf$Yield) # 以下代码会出现x轴时间顺序错乱问题 ggplot(koka, aes(x=factor(format(M_Datum, "%b %Y")), y=Yiel,group = 1)) + geom_point(size=7,colour="#EF783D",shape=17) + geom_line(color="#EF783D")+ theme(axis.text.x = element_text(angle = 0, vjust = 0.5, hjust=1))+ theme(axis.text.y.left = element_text(color = "#EF783D"), axis.title.y.left = element_text(color = "#EF783D"))+ ylab("Wafer Quantity")+ xlab("")
解决方法
核心逻辑是手动指定因子的水平顺序,让因子顺序和真实时间顺序保持一致,即可同时实现x轴等距、时间顺序正确的效果,不需要强行适配scale_x_date,轴标签配置用离散轴专用的scale_x_discrete即可:
- 聚合统计完成后,先按真实日期字段对数据集升序排序
- 生成x轴的日期标签因子时,手动传入
levels参数,按时间先后顺序指定因子水平,避免默认按字符排序导致的乱序 - 后续如果需要调整x轴标签角度、展示间隔、文本内容,直接通过
scale_x_discrete配置即可
修正后的绘图代码如下:
# 先按真实日期排序 koka <- koka[order(koka$M_Datum), ] ggplot(koka, aes( # 手动指定因子水平为按时间排序后的标签,保证顺序正确 x = factor( format(M_Datum, "%b %Y"), levels = format(sort(unique(M_Datum)), "%b %Y") ), y = Yiel, group = 1 )) + geom_point(size=7,colour="#EF783D",shape=17) + geom_line(color="#EF783D")+ # 离散轴标签配置用scale_x_discrete即可 scale_x_discrete(name = "") + theme(axis.text.x = element_text(angle = 0, vjust = 0.5, hjust=1))+ theme(axis.text.y.left = element_text(color = "#EF783D"), axis.title.y.left = element_text(color = "#EF783D"))+ ylab("Wafer Quantity")
内容的提问来源于stack exchange,提问作者samir
相关产品推荐
相关产品推荐

