如何为ggplot2中两个数据框的折线添加标签与图例?
解决ggplot2折线图添加颜色、标签和图例的问题
你当前的代码无法生成图例,核心原因是没有将分组信息(香港/伦敦)映射到aes()中的color参数,同时两个数据集的列名不统一也增加了操作复杂度。以下是两种可行的解决方案:
方案一:合并数据集(推荐,符合ggplot2最佳实践)
ggplot2基于「长格式数据」设计,合并数据集后通过变量映射自动生成图例,代码更简洁易维护:
library(ggplot2) library(dplyr) # 1. 处理两个数据集:统一列名+添加城市标识 hk_data <- hkviolentcrimeperpop %>% rename(year = violent_crime, cases = indecent_assault) %>% mutate(city = "Hong Kong") london_data <- londonviolentcrimeperpop %>% rename(year = violentcrimes, cases = other_sexual_offences) %>% mutate(city = "London") # 2. 合并为单个数据集 combined_data <- bind_rows(hk_data, london_data) # 3. 绘制图表,通过color映射城市分组 potsexass <- ggplot(combined_data, aes(x = year, y = cases, color = city)) + geom_line() + geom_point() + scale_x_continuous(breaks = seq(2011, 2020, 1)) + labs( x = "Year", y = "Number of Cases", title = "Indecent or Sexual Assaults", color = "City" # 设置图例标题 ) + theme(plot.title = element_text(size = 15)) # 修正标题大小的设置(原代码labs里的size参数无效) print(potsexass)
方案二:不合并数据集,手动指定颜色映射
如果不想合并数据集,可在每个geom的aes()中显式指定分组名称,再通过scale_color_manual定义颜色和图例:
library(ggplot2) potsexass <- ggplot() + # 香港数据:将color放入aes中,指定分组名称 geom_line(data = hkviolentcrimeperpop, aes(x = violent_crime, y = indecent_assault, color = "Hong Kong")) + geom_point(data = hkviolentcrimeperpop, aes(x = violent_crime, y = indecent_assault, color = "Hong Kong")) + # 伦敦数据:同理指定分组名称 geom_line(data = londonviolentcrimeperpop, aes(x = violentcrimes, y = other_sexual_offences, color = "London")) + geom_point(data = londonviolentcrimeperpop, aes(x = violentcrimes, y = other_sexual_offences, color = "London")) + scale_x_continuous(breaks = seq(2011, 2020, 1)) + scale_color_manual( name = "City", # 图例标题 values = c("Hong Kong" = "#1f77b4", "London" = "#ff7f0e") # 自定义颜色,可替换为你需要的色值 ) + labs( x = "Year", y = "Number of Cases", title = "Indecent or Sexual Assaults" ) + theme(plot.title = element_text(size = 15)) print(potsexass)
关键说明
- 必须将
color放在aes()内部,而非直接在geom_line(color="red")中设置——只有映射到变量的美学属性才会生成图例。 - 原代码中
labs(title=..., size=15)是错误用法,标题大小需要通过theme(plot.title = element_text(size=15))设置。
内容的提问来源于stack exchange,提问作者Zico Yuen
相关产品推荐
相关产品推荐

