如何为ggplot2的geom_bar图添加Axis_color指定配色并展示双图例
实现代码
先加载依赖包、构造数据:
library(ggplot2) library(dplyr) # 导入示例数据 data <- structure(list(x = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "D", "D", "D", "D", "D", "E", "E", "E", "E", "E"), y = c(25, 88, 88, 22, 18, 54, 25, 37, 68, 72, 36, 84, 17, 64, 48, 15, 17, 72, 61, 25, 66, 10, 18, 99, 63 ), group = c("F", "G", "H", "I", "J", "F", "G", "H", "I", "J", "F", "G", "H", "I", "J", "F", "G", "H", "I", "J", "F", "G", "H", "I", "J"), Axis_color = c("G1", "G1", "G1", "G1", "G1", "G3", "G3", "G3", "G3", "G3", "G1", "G1", "G1", "G1", "G1", "G2", "G2", "G2", "G2", "G2", "G3", "G3", "G3", "G3", "G3")), row.names = c(NA, -25L), class = "data.frame") # 自定义配色表 color_list<- c("F"="orange", "G"="darkgreen", "H"="grey", "I"="pink", "J"="purple", "G1"="blue","G2"="red","G3"="green")
提取每个分类x对应的轴标签颜色映射:
x_color_map <- data %>% distinct(x, Axis_color) %>% pull(Axis_color, name = x)
绘图核心代码:
ggplot(data, aes(x = x, y = y)) + # 柱状图图层,填充映射到group字段 geom_bar(stat = "identity", aes(fill = group)) + # 透明点图层,仅用于生成Axis_color对应的颜色图例 geom_point(aes(color = Axis_color), alpha = 0) + coord_flip() + # 配置填充色,调用配色表中group对应色值 scale_fill_manual(values = color_list[names(color_list) %in% unique(data$group)]) + # 配置轴分组色,调用配色表中G1/G2/G3对应色值 scale_color_manual(name = "Axis分组", values = color_list[names(color_list) %in% unique(data$Axis_color)]) + # 设置y轴(翻转后的分类轴)标签颜色对应配置 theme(axis.text.y = element_text(color = color_list[x_color_map])) + # 调整Axis分组图例样式,改为实心方形显示 guides(color = guide_legend(override.aes = list(alpha = 1, shape = 15, size = 5)))
实现说明
- 新增的透明
geom_point图层仅用于触发color映射的图例生成,不会在图上显示多余元素 - 通过
distinct提取每个x分类对应的唯一Axis_color值,直接映射到分类轴的文字颜色 - 两个
scale_*_manual分别读取配色表中对应字段的色值,保证配色统一 - 最终输出会生成两个独立图例:一个为group对应的填充色图例,一个为Axis_color对应的分组色图例
内容的提问来源于stack exchange,提问作者chippycentra
相关产品推荐
相关产品推荐

