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

ggplot2绘图时如何为geom_smooth等元素添加多个图例

解决方案

ggplot2默认只会对aes()内部声明的美学映射生成图例,你原先的美国家庭收入中位数的点、线没有绑定任何美学映射,所以不会出现在图例中。我们可以通过手动给该系列绑定自定义映射,再通过标度函数手动指定对应样式,实现两个系列都在图例展示的效果。

修改后的可运行代码如下:

library(ggplot2)
library(ggthemes) # 加载主题依赖包

# 你提供的示例数据集
data <- structure(list(Year = 2006:2021, Month_USD = c(1160L, 1240L, 
1360L, 1480L, 1320L, 1320L, 375L, 1600L, 2000L, 2000L, 1600L, 
2240L, 1900L, 2300L, 2900L, 2300L), Degree = c("High School", 
"High School", "High School", "High School", "High School", "High School", 
"High School", "High School", "High School", "BA", "BA", "BA", 
"BA", "BA", "M.Ed", "M.Ed"), Country = c("USA", "USA", "USA", 
"USA", "USA", "USA", "DE", "USA", "USA", "USA", "USA", "USA", 
"PRC", "PRC", "PRC", "HK"), Job = c("Disher", "Prep", "Prep", 
"Prep", "Prep", "Prep", "Au Pair", "CSA", "Valet", "Valet", "Intake", 
"CM", "Teacher", "Teacher", "Teacher", "Student"), Median_Household_Income_US = c(4833L, 
4961L, 4784L, 4750L, 4626L, 4556L, 4547L, 4706L, 4634L, 4873L, 
5025L, 5218L, 5360L, 5725L, NA, NA), US_Home_Price_Index = c(183.24, 
173.36, 152.56, 146.69, 140.64, 135.16, 143.88, 159.3, 166.5, 
175.17, 184.51, 195.99, 204.9, 212.59, 236.31, NA)), class = "data.frame", row.names = c(NA, 
-16L))

# 绘图代码
ggplot(data = data)+
  geom_smooth(mapping = aes(x=Year,y=Month_USD, linetype = "个人月收入"))+
  geom_point(mapping = aes(x=Year,y=Month_USD,color=Degree))+
  geom_smooth(mapping = aes(x=Year,y=Median_Household_Income_US, linetype = "美国家庭月收入中位数"))+
  geom_point(mapping = aes(x=Year,y=Median_Household_Income_US, shape = "美国家庭月收入中位数"), color = "black")+
  labs(title = "收入与人群中位数对比",
       subtitle = "个人收入 vs 人群中位数 2006-2021",
       caption = "*Statistica Research Department, Jan. 20, 2021.",
       color = "个人学历",
       linetype = "收入类型",
       shape = "收入类型")+
  scale_linetype_manual(values = c("个人月收入" = "solid", "美国家庭月收入中位数" = "dashed"))+
  scale_shape_manual(values = c("美国家庭月收入中位数" = 16))+
  theme_cleveland()+
  theme(plot.title = element_text(color = "blue",
                                  size = 16,
                                  face = "bold"),
        plot.subtitle = element_text(size=10,
                                     face = "bold"),
        plot.caption = element_text(face = "italic"))

修改后图例会包含两部分:

  • 不同学历对应的颜色标识,标注为「个人学历」
  • 两类收入对应的线型、点样式标识,标注为「收入类型」,可以清晰区分两条曲线和对应点的含义。

如果不需要拆分两个图例,也可以先将数据集转换为长格式,把「个人月收入」「美国家庭月收入中位数」作为同一列的枚举值,再统一映射美学属性,逻辑会更简洁。


内容的提问来源于stack exchange,提问作者Shawn Hemelstrand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 08:42:02