如何修改小提琴图背景颜色并添加置于图后方的网格?
解决小提琴图背景色与后置网格的问题
我看了你的代码,问题主要出在绘图顺序和par()参数的冲突上,下面一步步帮你修正:
问题分析
- 网格覆盖小提琴图:你先绘制了小提琴图,再调用
grid(),这会让网格画在图的上层,遮挡部分内容。R的绘图是按代码顺序叠加的,先画的在底层,后画的在上层。 par()参数冲突:你在par()里重复设置了col="blue"和col="red",后者会覆盖前者,导致轴颜色等设置混乱。- 背景色范围:
par(bg)设置的是整个绘图设备(包括边缘空白区)的背景,如果只想给绘图区域加背景,用rect()更合适。
修改后的代码
library(vioplot) # 设置绘图参数,避免重复的col设置 par(mai=c(0.65,0.65,0.1,0.1), lwd=2, col.axis="blue", las=1, cex.axis=1, cex.lab=1) # 准备数据 x1 <- mtcars$mpg[mtcars$cyl==4] x2 <- mtcars$mpg[mtcars$cyl==6] x3 <- mtcars$mpg[mtcars$cyl==8] # 先绘制绘图区域的背景(可选,如果你只想给绘图区加背景) plot(0, 0, type="n", xlim=c(0.5, 3.5), ylim=range(c(x1,x2,x3)), axes=FALSE, xlab="", ylab="") rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col="lightblue", border=NA) # 绘制网格(此时网格在背景层) grid(nx = NULL, ny = NULL, col = "black", lty = "dotted") # 绘制小提琴图(叠加在网格和背景之上) vioplot(x1, x2, x3, names=c("4 cyl", "6 cyl", "8 cyl"), col="green", border="blue", lwd = 2, lty=3, rectCol="black", colMed = "orange", add=TRUE) # 用add=TRUE叠加到已有绘图上 # 添加轴和标题 axis(1, col="blue", col.ticks="blue", lwd=2) axis(2, col="blue", col.ticks="blue", lwd=2) title(ylab = expression(bold("MPG")), xlab=expression(bold("CYL")), line = 2, col.lab="blue")
关键修改点
- 先画背景和网格:先创建空绘图,填充背景色,再画网格,最后叠加小提琴图,确保网格在底层。
- 清理
par()参数:去掉重复的col设置,避免冲突。 - 使用
add=TRUE:让小提琴图叠加在已有的背景和网格上,而不是重新创建绘图设备。 - 背景色控制:用
rect()只给绘图区域填充背景,而不是整个设备,视觉效果更自然。
如果还是想要整个设备的背景,只需要把par()里加上bg="lightblue",同时去掉rect()那部分代码即可。
内容的提问来源于stack exchange,提问作者Baltazár Tivadar




