You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ggplot技巧:合并图例框并自定义图例项顺序

ggplot堆叠柱状图与散点图例优化方案

问题1:合并散点与柱状图的图例

要将散点和柱状图的图例合并到同一个框中,核心是统一使用同一美学映射(如fill),并调整散点的显示样式使其与柱状图图例区分开:

  1. 将散点的美学映射从colour改为fill,同时设置shape=21(带边框的圆形,支持填充色);
  2. 在scale_fill_manual中添加散点("Z")的颜色配置;
  3. 通过breaks参数指定图例项的整体顺序。

问题2:自定义柱状图图例顺序

ggplot默认按字母顺序排列图例项,要自定义顺序需将分类变量转换为因子并指定levels顺序:

  1. 将bar_data中的variable列转为因子,手动设置levels对应原始变量名,labels对应显示名称;
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 17:39:53