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

如何为双轴ggplot图表添加图例?

ggplot双轴图添加图例的解决方案

你的代码里图例不显示的核心原因是:所有元素的颜色、填充都是直接硬编码赋值(比如fill = "green3"),没有通过aes()建立变量映射关系——ggplot只有检测到美学映射时才会自动生成图例。直接把颜色塞进aes()会导致逻辑混乱,正确的做法是先整理数据格式,再统一设置映射:

解决步骤及修改后代码

1. 转换数据为长格式

把Prediction和Actual列合并成一列,新增分组列(比如type),这样可以用同一组geom_line和geom_point绘制两组数据,自动生成映射:

2. 统一设置美学映射

在aes里指定color、fill、shape与分组变量的映射,再用scale_*_manual手动设置对应样式,同时处理双轴和柱状图的图例:

library(ggplot2)
library(tidyr)

# 示例数据
data <- data.frame(group = LETTERS[1:5],    
                   pol_nb = c(1000, 800, 1200, 900, 800),
                   Prediction = c(0.6, 0.9, 0.9, 0.5, 0.8),
                   Actual = c(0.5, 1.0, 1.2, 1.5, 0.9))
buffer <- 0.5
scale <- max(data$Prediction)/max(data$pol_nb)
total <- sum(data$pol_nb)

# 转换为长格式
data_long <- pivot_longer(data, cols = c(Prediction, Actual), 
                          names_to = "type", values_to = "value")

ggplot() +
  # 绘制折线和点(统一映射分组)
  geom_line(data = data_long, aes(x = group, y = value, color = type, group = type), linewidth = 1) +
  geom_point(data = data_long, aes(x = group, y = value, fill = type, shape = type), size = 3, color = "black") +
  
  # 绘制柱状图
  geom_col(data = data, aes(x = group, y = pol_nb * buffer * scale, fill = "Policies"), 
           color = "black", width = 0.5) + 
  
  # 设置Y轴双轴
  scale_y_continuous(
    name = "Prediction",
    sec.axis = sec_axis(~ ./ (buffer * scale * total), 
                        name = 'PoliciesDistribution',
                        labels = scales::label_percent())) +
  
  # 手动指定颜色、填充、形状
  scale_color_manual(values = c("Prediction" = "green3", "Actual" = "purple", "Policies" = "gold")) +
  scale_fill_manual(values = c("Prediction" = "green3", "Actual" = "purple", "Policies" = "gold")) +
  scale_shape_manual(values = c("Prediction" = 21, "Actual" = 22, "Policies" = NA)) +
  
  # 调整图例(隐藏形状的NA项,统一图例标题)
  guides(
    shape = guide_legend(override.aes = list(shape = c(21,22,NA))),
    color = guide_legend(title = "Category"),
    fill = guide_legend(title = "Category")
  ) +
  
  theme_light()

关键改动说明

  • 将宽格式数据转长格式,让Prediction和Actual共享同一组geom,避免重复代码,同时自然生成分组映射
  • 把所有需要图例的元素(折线、点、柱状图)的color/fill都放到aes()里,用分组变量或固定字符串(比如"Policies")建立映射
  • 用scale_*_manual统一设置各分组的颜色、填充、形状,确保图例样式与图表一致
  • 通过guides()调整图例显示,隐藏柱状图不需要的形状符号,统一图例标题

内容的提问来源于stack exchange,提问作者Patrick Jung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:54:52