R ggplot2:将27列按每3组为单位设置渐变绿色填充色
解决柱状图分组渐变绿色填充问题
你当前的代码用rep(c("darkseagreen1", "darkolivegreen1", "darkseagreen4"),9)循环颜色,会让第1、4、7…列共用同一种颜色,无法实现“每3列为一组,组内颜色一致、组间渐变加深”的效果。下面针对两种常见场景给出修正方案:
场景1:27列分为9组,每组3列,组内同色、组间绿色渐变加深
如果27列是按顺序每3列一组(比如第1-3列是第一组,4-6列是第二组…25-27列是第九组),可以通过给每组分配专属颜色实现需求:
# plot average for each ellenberg category for each quadrat i = 1 for (df in ellenCatTab){ plotName <- names(ellenCatTab)[i] i = i + 1 col_means <- colMeans(df[,5:31], na.rm=TRUE) col_meansdf <- stack(col_means) # 为每个柱子分配组号:每3个一组,共9组 col_meansdf$group <- rep(1:9, each=3) # 生成从浅到深的9种绿色渐变调色板 green_palette <- colorRampPalette(c("darkseagreen1", "darkolivegreen4"))(9) p <- ggplot(col_meansdf, aes(x=ind, y=values, fill=factor(group))) + ggtitle(plotName) + geom_col() + theme_classic() + scale_fill_manual(values=green_palette, drop=FALSE) + theme(legend.position='none') plot(p) }
场景2:27列是X1、X2、X3各9个,需同类列颜色一致
如果列名是X1、X2、X3重复9次(比如每3列都是X1、X2、X3),需要让所有X1柱子同色、X2同色、X3同色,且三个颜色渐变加深,可修改如下:
# plot average for each ellenberg category for each quadrat i = 1 for (df in ellenCatTab){ plotName <- names(ellenCatTab)[i] i = i + 1 col_means <- colMeans(df[,5:31], na.rm=TRUE) col_meansdf <- stack(col_means) # 提取类别:如果列名是直接X1/X2/X3,直接用col_meansdf$ind即可 # 若列名带前缀(如Group1_X1),用下面的代码提取X1/X2/X3 col_meansdf$category <- sub(".*(X\\d)", "\\1", col_meansdf$ind) # 生成3种渐变绿色,对应X1、X2、X3 green_palette <- colorRampPalette(c("darkseagreen1", "darkolivegreen4"))(3) names(green_palette) <- c("X1", "X2", "X3") # 匹配你的类别名 p <- ggplot(col_meansdf, aes(x=ind, y=values, fill=category)) + ggtitle(plotName) + geom_col() + theme_classic() + scale_fill_manual(values=green_palette, drop=FALSE) + theme(legend.position='none') plot(p) }
关键修改说明
- 新增分组变量:通过
rep(1:9, each=3)或提取类别,让同组/同类柱子共享同一个填充映射 - 使用
colorRampPalette生成平滑渐变的绿色系,替代固定循环的颜色列表 - 将
fill映射到分组/类别变量,而非单个列名ind,确保同组颜色一致
内容的提问来源于stack exchange,提问作者Melanie Baker
相关产品推荐
相关产品推荐

