ggplot2调用scale_x_date时如何实现X轴等距去除缺失月份空白

问题根源
代码存在刻度映射冲突:aes()中已经将x轴映射为格式化后的月份因子(离散分类值),但又额外调用了仅适用于连续型日期值的scale_x_date()。连续日期刻度会严格按照真实时间跨度排布轴元素,缺失的月份会自动留出对应宽度的空白,和离散因子的等距排布逻辑冲突,最终出现不符合预期的间隙。
修复方案
直接删除冲突的scale_x_date(labels="%b %Y")语句即可。离散分类轴会自动按照数据中实际存在的月份等距排列刻度,不会为无数据的月份预留空白。
注意:直接转换因子可能出现月份按字母顺序排序的问题(比如Apr排在Jan前),需要在转换因子时显式指定水平顺序,保证标签按实际时间先后排列。
修正后可运行代码
filtredplot1<-reactive({ req(res_mod()) dat<-res_mod() dt<-dat[dat$M_Datum >= input$dateRange[1] & dat$M_Datum <= input$dateRange[2],] dt[,5]<-as.Date(format(as.Date(dt[,5]), "%Y-%m-01")) req(dt$M_Datum,dt$Yield) dr<-data.frame("M_Datum"=dt$M_Datum,"Yield"=dt$Yield) mydf=aggregate(Yield ~ M_Datum, dr, length) req(mydf$M_Datum,mydf$Yield) koka<-data.frame("M_Datum"=mydf$M_Datum,"Yiel"=mydf$Yield) # 生成按时间顺序排序的x轴标签因子,避免乱序 koka$x_tick <- factor( format(koka$M_Datum, "%b %Y"), levels = format(sort(unique(koka$M_Datum)), "%b %Y") ) ggplot(koka, aes(x=x_tick, 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), axis.text.y.left = element_text(color = "#EF783D"), axis.title.y.left = element_text(color = "#EF783D") )+ ylab("Wafer Quantity")+ xlab("") })
补充说明
如果需要保留连续日期轴的属性,也可以通过scale_x_date(breaks = koka$M_Datum, labels = ~format(.x, "%b %Y"))仅显示存在数据的月份刻度,但这种方式下轴间距仍和真实时间差成正比(间隔2个月的点视觉间距是间隔1个月的2倍),无法实现等距效果,不符合当前需求场景。
内容的提问来源于stack exchange,提问作者samir
相关产品推荐
相关产品推荐

