如何在ggplot2中实现小提琴图与白色箱线图独立填充及图例控制?
解决ggplot2中小提琴图与箱线图的填充和图例问题
嘿,这个问题其实很典型,咱们分两步来搞定它:
1. 让箱线图单独显示白色,保留小提琴图的分组填充
你之前的问题是全局aes里设置了fill = group,导致小提琴图和箱线图都继承了这个填充映射,所以用scale_fill_manual会同时影响两者。解决思路是把填充映射只绑定给小提琴图,箱线图直接设置固定的白色填充,同时用group参数保证和小提琴图的位置对齐:
library(ggplot2) library(reshape2) # 构造数据(设置随机种子让结果可复现) set.seed(123) dat <- list( A = rbind( data.frame(group = "1", vals = rnorm(500)), data.frame(group = "2", vals = rnorm(100)) ), B = rbind( data.frame(group = "1", vals = rnorm(500)), data.frame(group = "2", vals = rnorm(100)) ), C = rbind( data.frame(group = "1", vals = rnorm(500)), data.frame(group = "2", vals = rnorm(100)) ) ) dat.melt <- melt(dat) # 调整dodge宽度让元素对齐更自然 dodge <- position_dodge(width = 0.8) p <- ggplot(dat.melt, aes(x = L1, y = value)) + # 小提琴图单独绑定fill映射到group变量 geom_violin(aes(fill = group), position = dodge) + # 箱线图设置固定白色填充,用group参数保证与小提琴图对齐 geom_boxplot(aes(group = group), width = 0.3, position = dodge, fill = "white", outlier.shape = NA) + # 自定义小提琴图的分组填充色(可替换为你需要的颜色) scale_fill_manual(values = c("#66c2a5", "#fc8d62")) print(p)
这样设置后,小提琴图会按group显示不同的填充色,箱线图始终是白色,两者的位置也能完美对齐。
2. 只显示小提琴图的图例,隐藏箱线图的图例
上面的代码已经自动实现了这个效果:因为箱线图的fill是固定值,没有绑定到任何变量映射,所以它不会生成图例项;只有小提琴图的fill是映射到group的变量,图例只会显示小提琴图的分组填充。
如果万一遇到图例仍包含多余项的情况,可以给箱线图加上show.legend = FALSE参数,强制隐藏它的图例:
geom_boxplot(aes(group = group), width = 0.3, position = dodge, fill = "white", outlier.shape = NA, show.legend = FALSE) # 强制隐藏箱线图的图例
这样就万无一失啦~
内容的提问来源于stack exchange,提问作者Poiu Rewq
相关产品推荐
相关产品推荐

