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

在R的ggplot2中不使用aes()如何为双轴图添加图例?

解决ggplot双轴图自定义图例问题

你的核心问题是没有正确利用aes的分类映射生成图例,直接在geom层硬编码颜色会覆盖映射逻辑,导致图例无法正常生成。下面是修改后的代码和关键说明:

修改后的完整代码

ggplot(new_construction, aes(year)) +
  # 柱状图:通过fill映射固定字符串,关联图例项
  geom_col(aes(y = total_new_constructions, fill = "新建建筑"), alpha = 0.8) +
  # 折线图:通过color映射固定字符串,关联图例项
  geom_line(aes(y = a + average_rental_prices*b, color = "平均租金"), lwd = 1.5) +
  # 手动指定填充色、线条色,统一图例标题合并图例
  scale_fill_manual(name = "指标类型", values = c("新建建筑" = "blue")) +
  scale_color_manual(name = "指标类型", values = c("平均租金" = "orange")) +
  # 保留原双轴设置逻辑
  scale_y_continuous(
    name = "Total New Constructions", breaks = seq(0, 30000, by = 10000),
    sec.axis = sec_axis(~ (. - a)/b, name = "Average Rental Prices", breaks = seq(0, 4000, by = 1000))
  ) +
  # 修复x轴刻度参数写法
  scale_x_continuous("Year", breaks = seq(2000, 2018)) +
  labs(
    title = "Total New Constructions and Average Rental Prices (2000-2018)",
    subtitle = "Data Source: TidyTuesday R"
  ) +
  theme_minimal() +
  theme(legend.position = "bottom")

关键修改点

  • 用固定字符串做aes映射:在geom_col的aes中写fill = "新建建筑",geom_line中写color = "平均租金",让ggplot将这两个字符串识别为分类变量,自动生成对应的图例项。
  • 手动绑定颜色与图例:通过scale_fill_manual和scale_color_manual给每个分类字符串指定对应颜色,同时设置相同的name参数,让两个独立图例合并为一个。
  • 移除硬编码颜色:删除原代码中geom_col的color="blue"、fill="blue"和geom_line的color="orange",避免覆盖aes的映射逻辑。
  • 修复x轴刻度:原scale_x_continuous参数写法错误,添加breaks=明确指定刻度值。

内容的提问来源于stack exchange,提问作者shi yun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:27:22