ggplot2双Y轴图表:保持轴位置不变,将折线置于柱状图上方
解决ggplot2双Y轴图表图层顺序问题
我接手了一个项目,此前所有图表均由Excel制作,现需使用ggplot2重绘以用于未来报告。我正在绘制双Y轴图表,可视化场地高降雨量与对应水深的关系,希望保持左右Y轴位置不变(左轴仍为水深,右轴仍为降雨量),但将折线图层(水深)置于柱状图层(降雨量)上方而非当前的下方,且不想通过调换轴位置解决,以保持历年报告的连续性。
解决方案
ggplot2的图层渲染顺序完全由代码中添加图层的顺序决定:先添加的图层会被置于底层,后添加的图层会覆盖在上方。原代码中先添加了geom_line(折线),再添加geom_col(柱状),所以柱状层覆盖了折线层。只需调换两个图层的添加顺序,先加柱状层,再加折线层,就能实现折线在上方的效果,同时完全保留原有的轴位置设置。
修改后的完整代码
library(ggplot2) library(dplyr) library(lubridate) Date <- c("2021-01-01","2021-01-01", "2021-01-05", "2021-01-05","2021-01-10", "2021-01-10", "2021-01-15","2021-01-15") Rainfall <- c(0.75, 0.5, 0.63, 0.9,0.5, 0.63, 0.9,0.6) Pool <- c("A","B","A","B","A","B","A","B") WaterDepth <- c(18,22,17,19,15,24,13,11) Var4 <- c(1000, 987,905,1002) nine <- data.frame(Date, WaterDepth,Pool,Rainfall, Var4) nine<-nine %>% mutate(Date = ymd(Date)) scale2=.05 figa <- ggplot() + # 先添加柱状图层(置于底层) geom_col(aes(x=Date, y = Rainfall/scale2,fill="Rainfall"),width=1,alpha=1)+ # 再添加折线图层(置于上层) geom_line(aes(x=Date,y = WaterDepth, color=Pool),linewidth=1.5)+ scale_fill_manual(values = c("#0070C0"))+ scale_color_manual(values=c("#C55A11","#99CC00"))+ labs( x="Date",y="Water Depth (cm)")+ scale_y_continuous(sec.axis = sec_axis(~.*scale2, name="Rainfall (cm)"),expand=c(0,0),limits=c(0,30)) + theme(legend.position="bottom", legend.title=element_blank(), legend.key.width=unit(.5,"cm"), legend.key.height=unit(.2,"cm"))+ theme(axis.line = element_line(colour = "black"), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.border = element_blank(), panel.background = element_blank(), axis.text=element_text(size=10), axis.title=element_text(size=13))+ labs(color = "Legend") figa
关键修改说明
- 调换了
geom_col和geom_line的顺序,确保折线图层后添加,渲染在柱状层上方 - 优化了代码中的
aes引用方式,直接使用列名而非nine$的形式,符合ggplot2的规范写法
内容的提问来源于stack exchange,提问作者Amanda Goldberg
相关产品推荐
相关产品推荐

