R语言绘图如何将abline()绘制的网格置于图表背景层
问题原因
R基础绘图采用顺序叠层逻辑:后执行的绘图元素会覆盖先执行的元素。你原有代码把abline()网格绘制放在plot()、lines()绘制时序曲线之后,网格自然会盖在曲线上方。
之前尝试panel.first未生效,基本是写法问题:该参数需要传入完整的绘图表达式,且仅在plot()核心图形元素渲染前执行,没有把网格代码完整写入表达式、或是写错位置都会导致失效。另外tck参数仅控制坐标轴刻度线长度,和图层顺序无关,调整它本来就不会有效果。
解决方案
以下两种方案均可实现网格置于底层的效果,按需选择即可:
方法1:正确使用panel.first参数(改动量最小)
直接把网格绘制的abline()代码写入plot()的panel.first参数,网格会在坐标轴绘制完成后、第一条时序线渲染前画出,后续lines()绘制的第二条时序线也会自动叠在网格上方,其余代码无需调整:
options(repr.plot.width=15, repr.plot.height=10) par(cex=1.5) plot(Serie_PIB_NO_ajustados_hasta_2018, xlab="Tiempo", ylab="Miles de millones de €", main="PIB pm Demanda España (datos no ajustados de estacionalidad y calendario)", col="blue", lwd = 3, xlim = c(1995, 2020), ylim = c(0, 350), xaxp = c(1995, 2019, 8), # 网格写在panel.first中,优先绘制 panel.first = { abline(h = c(0, 50, 100, 150, 200, 250, 300, 350), col = "grey") abline(v = c(1995, 1998, 2001, 2004, 2007, 2010, 2013, 2016, 2019), col = "grey") }) lines(Serie_PIB_NO_ajustados_2019, col="green", lwd=3)
方法2:手动控制绘制顺序(兼容性最好)
如果担心panel.first在时序绘图方法中存在兼容问题,可以先绘制空的坐标轴框架,先画网格再依次绘制两条时序线,层级逻辑完全可控,不会出现覆盖问题:
options(repr.plot.width=15, repr.plot.height=10) par(cex=1.5) # 第一步:绘制空图框架,仅渲染坐标轴、标题,不绘制实际时序线 plot(Serie_PIB_NO_ajustados_hasta_2018, xlab="Tiempo", ylab="Miles de millones de €", main="PIB pm Demanda España (datos no ajustados de estacionalidad y calendario)", col="blue", lwd = 3, xlim = c(1995, 2020), ylim = c(0, 350), xaxp = c(1995, 2019, 8), type = "n" # 关键参数:不渲染核心绘图元素,仅输出框架 ) # 第二步:先绘制网格(最底层) abline(h = c(0, 50, 100, 150, 200, 250, 300, 350), col = "grey") abline(v = c(1995, 1998, 2001, 2004, 2007, 2010, 2013, 2016, 2019), col = "grey") # 第三步:最后绘制两条时序线(叠在网格上方) lines(Serie_PIB_NO_ajustados_hasta_2018, col="blue", lwd=3) lines(Serie_PIB_NO_ajustados_2019, col="green", lwd=3)
优化提示
- 如果觉得网格线过于突兀,可以给
abline()添加lty=3参数设置为虚线,或是将颜色调整为col=grey(0.8)调浅灰度,视觉效果更协调。 - 不需要额外调整
par()中的图层相关参数,上述两种方法均不需要修改全局绘图配置。
内容的提问来源于stack exchange,提问作者AlejandroDGR
相关产品推荐
相关产品推荐

