如何为同组数据的小提琴图与箱线图设置不同色阶?
实现小提琴图与箱线图的独立调色板
要给叠加的小提琴图和箱线图设置不同的填充调色板,有两种常用方法:
方法一:使用ggnewscale包(推荐,更灵活)
这个包允许在同一张图中使用多个相同的美学尺度(比如两次fill),步骤如下:
- 先安装并加载所需包:
install.packages("ggnewscale") library(ggplot2) library(RColorBrewer) library(ggnewscale)
- 修改绘图代码:
# 生成数据 x <- matrix(runif(n=1000,0,1),ncol =4 ) df <- reshape2::melt(x) df$Var2 <- as.factor(df$Var2) df$Var3 <- df$Var2 df |> ggplot(aes(x = Var2, y = value)) + # 绘制小提琴图,使用Set2调色板 geom_violin(aes(fill = Var2)) + scale_fill_brewer(palette = "Set2", guide = "none") + # 重置fill尺度,为箱线图开启独立的调色板 new_scale_fill() + # 绘制箱线图,使用Dark2调色板 geom_boxplot(width=0.2, aes(fill = Var3)) + scale_fill_brewer(palette = "Dark2", guide = "none") + # 主题与其他设置 theme_light() + geom_hline(yintercept = 0) + theme( axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank(), ) + labs(x = NULL, y = NULL)
方法二:手动指定颜色(无需额外安装包)
如果不想安装新包,可以直接为箱线图手动分配颜色,通过group参数保证分组正确:
# 生成数据 x <- matrix(runif(n=1000,0,1),ncol =4 ) df <- reshape2::melt(x) df$Var2 <- as.factor(df$Var2) library(ggplot2) library(RColorBrewer) # 获取两种调色板的颜色 violin_cols <- brewer.pal(4, "Set2") boxplot_cols <- brewer.pal(4, "Dark2") df |> ggplot(aes(x = Var2, y = value)) + # 小提琴图使用Set2调色板 geom_violin(aes(fill = Var2)) + scale_fill_manual(values = violin_cols, guide = "none") + # 箱线图手动指定Dark2颜色,用group确保分组对应 geom_boxplot(width=0.2, aes(group = Var2), fill = boxplot_cols[as.numeric(df$Var2)], inherit.aes = FALSE) + theme_light() + geom_hline(yintercept = 0) + theme( axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank(), ) + labs(x = NULL, y = NULL)
说明
- 两种方法都隐藏了图例(
guide = "none"),符合你原来的需求。 scale_fill_brewer可以直接调用RColorBrewer的内置调色板,无需手动提取颜色向量。
内容的提问来源于stack exchange,提问作者user3236841
相关产品推荐
相关产品推荐

