ggplot技巧:合并图例框并自定义图例项顺序
ggplot堆叠柱状图与散点图例优化方案
问题1:合并散点与柱状图的图例
要将散点和柱状图的图例合并到同一个框中,核心是统一使用同一美学映射(如fill),并调整散点的显示样式使其与柱状图图例区分开:
- 将散点的美学映射从
colour改为fill,同时设置shape=21(带边框的圆形,支持填充色); - 在
scale_fill_manual中添加散点("Z")的颜色配置; - 通过
breaks参数指定图例项的整体顺序。
问题2:自定义柱状图图例顺序
ggplot默认按字母顺序排列图例项,要自定义顺序需将分类变量转换为因子并指定levels顺序:
- 将
bar_data中的variable列转为因子,手动设置levels对应原始变量名,labels对应显示名称; - 在
scale_fill_manual的breaks参数中按需求排列图例项顺序。
修改后的完整代码
plot_data <- structure(list(unit = c("AA", "AA", "AA", "AA", "AA", "AA", "AA" ), group = c("A", "B", "C", "D", "E", "F", "G"), varZ = c(0.315095655620098, 8.47993358969688, 1.07286661490798, 0.451091277599335, -3.06214834600687, 0.356725811958313, 2.84848970770836), varA = c(0.0098613808164373, 0.641465996578336, 0.361015032231808, 0.213144088536501, 0.389915533736348, 0.0736596005037427, 0.110731973079965), varC = c(0.341579372435808, 0.330122645944357, 0.45065661072731, 0.092761187441647, 0.368695167452097, 0.542871625348926, 0.563651240617037), varD = c(-0.00427791306283325, 0.323448045179248, 0.017125289858086, 0.0177044845186174, 0.0418251685332507, 0.0367124438518658, 0.0115989629644901), varB = c(-0.101550728082657, 1.68335139006376, 0.36021358249709, -0.529840487614274, -0.199755599349737, 0.260609032586217, 0.358311578631401), varE = c(0.0694835543632507, 5.50154550075531, -0.116143900901079, 0.657321977615356, -3.66282860934734, -0.5571269325912, 1.80419590175152)), row.names = c(NA, -7L), class = c("data.table", "data.frame")) ## 数据处理 bar_data <- plot_data[][, list(unit, group, varA, varB, varC, varD, varE)] bar_data <- melt(bar_data, id.vars= c("unit", "group")) # 转换为因子,自定义顺序:A、B、C、D、E bar_data$variable <- factor(bar_data$variable, levels = c("varA", "varB", "varC", "varD", "varE"), labels = c("A", "B", "C", "D", "E")) line_data <- plot_data[][, list(unit, group, varZ)] line_data <- melt(line_data, id.vars=c("unit", "group")) p <- ggplot() + # 堆叠柱状图 geom_col(data = bar_data, aes(y = value, x = group, fill = variable) ) + # 散点:使用fill美学,shape=21实现带填充的圆形 geom_point(data = line_data, aes(y = value, x = group, fill = "Z"), shape = 21, size = 3, colour = "black" ) + theme( legend.key.height = unit(.15,"cm"), legend.key.width = unit(.8,"cm"), legend.position = "bottom", legend.title = element_blank() ) + # 统一设置填充色,包含柱状图和散点的颜色,自定义顺序 scale_fill_manual( values = c( "A" = "#005390", "B" = "#B6C5DE", "C" = "#082A4A", "D" = "#7AACF6", "E" = "#00B0F0", "Z" = "black" ), breaks = c("A", "B", "C", "D", "E", "Z") # 指定图例显示顺序 ) + guides(fill = guide_legend(ncol = 2)) print(p)
关键说明
- 图例合并:通过将散点的美学映射改为
fill,让它与柱状图共享同一个图例系统,再通过shape=21区分散点与柱状图的图例符号; - 自定义顺序:将
bar_data$variable转为因子并指定levels,确保ggplot按你设定的顺序渲染图例,最后在scale_fill_manual的breaks中确认整体顺序(包括新增的"Z"项)。
内容的提问来源于stack exchange,提问作者gitcanzo
相关产品推荐
相关产品推荐

