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
相关产品推荐
相关产品推荐

