在R语言中如何为geom_line多折线图添加分组(填充)标签?
问题描述
现有包含年份、媒体名称、两个关键词提及次数列的数据框,示例数据如下:
| year | medium_name | n_transsexu | n_transgende |
|---|---|---|---|
| 2012 | New York Times | 15 | 22 |
| 2012 | Daily Mail | 10 | 20 |
| 2013 | New York Times | 10 | 12 |
尝试用以下ggplot代码绘制折线图,展示两个关键词的提及次数随时间的变化,并按媒体区分:
yeardf_medium %>% ggplot(aes(x=year, group = medium_name)) + geom_line(aes(y = n_transsexu, col = "transsexuell etc.")) + geom_line(aes(y = n_transgende, col = "transgender etc.")) + labs(title = "Nennung spezifischer Schlüsselwörter über Zeit (nach Medium)", subtitle = "transsexuell/Transsexualismus etc. vs. transgender/Transgenderismus etc", x = "Jahr", y = "Anzahl Nennungen")
当前图表仅能通过颜色区分两个关键词,无法区分不同媒体,也没有媒体分组的图例,需要解决如何同时展示媒体和关键词的图例。
解决方案
核心问题是当前数据为宽格式,无法同时将媒体和关键词类型映射到视觉属性(如颜色、线型)。需要先将数据转换为长格式,再调整ggplot的美学映射:
步骤1:转换数据格式
使用tidyr::pivot_longer将两个数值列合并为一列,同时新增一列标记关键词类型:
library(tidyr) library(ggplot2) # 转换为长格式 yeardf_long <- yeardf_medium %>% pivot_longer( cols = c(n_transsexu, n_transgende), # 选择要转换的数值列 names_to = "keyword_type", # 新增列:标记关键词类型 values_to = "count" # 新增列:存储提及次数 ) %>% # 替换关键词类型的显示文本,与原代码保持一致 mutate(keyword_type = case_when( keyword_type == "n_transsexu" ~ "transsexuell etc.", keyword_type == "n_transgende" ~ "transgender etc." ))
步骤2:绘制带双图例的折线图
在ggplot中,将medium_name映射到color(区分媒体),keyword_type映射到linetype(区分关键词),两个维度会自动生成对应的图例:
yeardf_long %>% ggplot(aes(x = year, y = count)) + geom_line(aes(color = medium_name, linetype = keyword_type), linewidth = 1) + labs( title = "Nennung spezifischer Schlüsselwörter über Zeit (nach Medium)", subtitle = "transsexuell/Transsexualismus etc. vs. transgender/Transgenderismus etc", x = "Jahr", y = "Anzahl Nennungen", color = "Medien", # 媒体图例的标题 linetype = "Schlüsselwort" # 关键词图例的标题 ) + theme_minimal() # 可选:优化图表样式
说明
- 转换长格式后,每一行对应一个媒体、年份、关键词类型的组合,ggplot可直接识别并分组绘图。
- 若需要交换区分维度,只需把
color和linetype的映射项互换即可(比如用颜色区分关键词,线型区分媒体)。
内容的提问来源于stack exchange,提问作者Valpal
相关产品推荐
相关产品推荐

