如何设置R语言barplot柱状图的网格边界避免超出绘图区域
问题原因
grid() 默认会覆盖全量用户坐标范围绘制网格,而barplot的离散x轴的坐标范围会略大于实际柱状图的显示边界,再加上你后续手动绘制了线宽更大的box(),网格线就会露出到边框外侧。
修复方案
方案1(最简修改,无需调整原有逻辑)
直接修改panel.first的参数,关闭绘图溢出允许,同时可以按需关闭不需要的垂直网格(大部分柱状图仅保留水平网格即可完全规避左右溢出问题),修改后的完整代码如下:
par(mfrow=c(1,2)) barplot(mean_trend[,2],names.arg = mean_trend[,1],col="skyblue",ylim = c(0.1,95),cex=0.8,cex.names=0.85,las=2,cex.lab=0.85,lwd=1.5, # 修改这一行,nx=NA代表不画垂直网格,xpd=FALSE限制内容溢出绘图区 panel.first = {par(xpd = FALSE); grid(nx = NA, ny = 8, lty = 1, col = "lightgray")}) mtext(side=2,line=2.3, "Average amount in mm", font=2, cex=0.8) box(lwd=1.5) barplot(freq_trend[,2],names.arg = freq_trend[,1],col="skyblue",ylim = c(2,4500),cex=0.85,cex.names=0.85,las=2,cex.lab=0.85,lwd=1.5, panel.first = {par(xpd = FALSE); grid(nx = NA, ny = 8, lty = 1, col = "lightgray")}) box(lwd=1.5) mtext(side=2,line=3.3, "Average flood frequency", font=2, cex=0.8)
如果需要保留垂直网格,把nx = NA改成你需要的垂直网格数量即可,xpd = FALSE会自动把超出绘图区域的网格线裁剪掉。
方案2(分层绘图,逻辑更可控)
如果你需要完全自定义网格的位置,也可以采用分层绘图的方式,先画空画布、再画网格、最后画柱子,完全避免层级和溢出问题:
par(mfrow=c(1,2), xpd = FALSE) # 第一张图 # 先画空画布获取柱子位置 pos <- barplot(mean_trend[,2], col = NA, border = NA, names.arg = mean_trend[,1], ylim = c(0.1,95), cex.names=0.85, las=2, cex.lab=0.85, lwd=1.5) grid(nx = NA, ny = 8) # 网格画在底层 barplot(mean_trend[,2], col = "skyblue", add = TRUE) # 柱子画在网格上层 mtext(side=2,line=2.3, "Average amount in mm", font=2, cex=0.8) box(lwd=1.5) # 第二张图 pos2 <- barplot(freq_trend[,2], col = NA, border = NA, names.arg = freq_trend[,1], ylim = c(2,4500), cex.names=0.85, las=2, cex.lab=0.85, lwd=1.5) grid(nx = NA, ny = 8) barplot(freq_trend[,2], col = "skyblue", add = TRUE) box(lwd=1.5) mtext(side=2,line=3.3, "Average flood frequency", font=2, cex=0.8)
内容的提问来源于stack exchange,提问作者dumei
相关产品推荐
相关产品推荐

