如何在ggplot2中为小提琴图填充与轮廓一致的颜色?
解决ggplot2小提琴图填充色与轮廓色一致的问题
你的问题出在:fill="color" 无法识别你在 aes 中动态生成的分组逻辑,导致填充色无法按组别区分。要让小提琴图的填充色和轮廓色匹配,核心是让 fill 和 color 映射到同一个分组变量,并同步颜色设置。
方法一:先给数据添加明确分组列(推荐,代码更清晰)
先在数据框中生成固定的分组列,后续直接映射这个列即可:
# 为数据添加分组列 Ram2$group <- c('WT', 'at5g01950')[2 - (as.numeric(Ram2$G) %% 2)] # 修改后的绘图代码 ggplot(Ram2, aes(x = G, y = T, color = group, fill = group)) + geom_violin(alpha = 0.8, adjust = 0.05) + # 同步设置color和fill的手动颜色映射 scale_color_manual(values = c(WT = '#3CBEC3', at5g01950 = '#C3413C')) + scale_fill_manual(values = c(WT = '#3CBEC3', at5g01950 = '#C3413C')) + geom_boxplot(width = 0.1, color = "black", alpha = 0.2, position = position_dodge(0.9)) + theme_minimal() + theme(plot.background = element_rect(fill = "white"), panel.grid.minor = element_blank()) + labs(color = '', fill = '')
方法二:直接在aes中同步fill和color的分组逻辑
如果不想修改原始数据,可以在 aes 中让 fill 和 color 使用完全相同的分组表达式:
ggplot(Ram2, aes(x = G, y = T, color = c('WT', 'at5g01950')[2 - (as.numeric(G) %% 2)], fill = c('WT', 'at5g01950')[2 - (as.numeric(G) %% 2)])) + geom_violin(alpha = 0.8, adjust = 0.05) + scale_color_manual(values = c(WT = '#3CBEC3', at5g01950 = '#C3413C')) + scale_fill_manual(values = c(WT = '#3CBEC3', at5g01950 = '#C3413C')) + geom_boxplot(width = 0.1, color = "black", alpha = 0.2, position = position_dodge(0.9)) + theme_minimal() + theme(plot.background = element_rect(fill = "white"), panel.grid.minor = element_blank()) + labs(color = '', fill = '')
简化优化(可选)
可以把颜色值存为变量,避免重复编写:
my_colors <- c(WT = '#3CBEC3', at5g01950 = '#C3413C') ggplot(Ram2, aes(x = G, y = T, color = group, fill = group)) + geom_violin(alpha = 0.8, adjust = 0.05) + scale_color_manual(values = my_colors) + scale_fill_manual(values = my_colors) + geom_boxplot(width = 0.1, color = "black", alpha = 0.2, position = position_dodge(0.9)) + theme_minimal() + theme(plot.background = element_rect(fill = "white"), panel.grid.minor = element_blank()) + labs(color = '', fill = '')
以上三种方式都能实现小提琴图填充色与轮廓色一一对应的效果。
内容的提问来源于stack exchange,提问作者André Lima
相关产品推荐
相关产品推荐

