You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修改小提琴图背景颜色并添加置于图后方的网格?

解决小提琴图背景色与后置网格的问题

我看了你的代码,问题主要出在绘图顺序par()参数的冲突上,下面一步步帮你修正:

问题分析

  1. 网格覆盖小提琴图:你先绘制了小提琴图,再调用grid(),这会让网格画在图的上层,遮挡部分内容。R的绘图是按代码顺序叠加的,先画的在底层,后画的在上层。
  2. par()参数冲突:你在par()里重复设置了col="blue"col="red",后者会覆盖前者,导致轴颜色等设置混乱。
  3. 背景色范围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

火山引擎 最新活动