ggplot2小提琴图按三组指定递增灰度填充色的实现方法
嘿,这个需求不难实现!问题出在你之前直接给fill设了固定颜色,没给数据做分组映射。咱们一步步来调整代码,实现每3列一组、灰度递增的填充效果:
完整解决方案代码
library(ggplot2) library(reshape2) # 别忘了加载这个包,不然melt函数用不了 # 生成你的9列矩阵数据 dat <- matrix(rnorm(100*9), ncol=9) # 把宽格式数据转成长格式 mat <- reshape2::melt(data.frame(dat), id.vars = NULL) # 关键步骤:给每3列添加一个分组变量 # V1-V3归为Group1,V4-V6归为Group2,V7-V9归为Group3 mat$group <- factor( floor((as.integer(mat$variable) - 1)/3) + 1, labels = c("Group 1", "Group 2", "Group 3") ) # 绘制小提琴图,按分组填充灰度递增的颜色 pp <- ggplot(mat, aes(x = variable, y = value, fill = group)) + geom_violin(scale="width", adjust = 1, width = 0.5) + # 指定灰度颜色:从浅灰到深灰(灰度递增,也就是黑度越来越高) scale_fill_manual( values = c("gray90", "gray60", "gray30"), name = "分组" # 这里可以自定义图例的名称,换成中文也没问题 ) + labs(x = "矩阵列", y = "数值") # 自定义坐标轴标签,按需修改 pp
关键细节解释
- 添加分组变量:通过
as.integer(mat$variable)把V1、V2...转换成1、2...,再用整数除法把每3个归为一组,最后转成因子类型方便ggplot识别分组。 - fill映射分组:把
fill = group放进aes()里,这样ggplot会自动给不同分组分配颜色,而不是用固定颜色。 - 灰度颜色设置:
gray90是非常浅的灰色,gray30是深灰色,这样设置就实现了灰度递增(黑度逐渐增加)的效果,如果你想要相反的顺序,把values里的颜色反过来就行。
之前你的代码没成功,是因为直接给fill传了单一颜色值,没有和分组变量绑定,所以所有小提琴都是同一种颜色。现在这样调整后,就能完美实现你想要的效果啦!
内容的提问来源于stack exchange,提问作者Snoop Dogg
相关产品推荐
相关产品推荐

