如何为ggplot绘制的多折线图添加图例
问题:为ggplot2分布曲线添加图例(虚线对应Party A,实线对应Party B)
用户提供的数据
x <- seq(-5, 5, length=1000) y1 <- dnorm(x, 0, 0.2) y2 <- dnorm(x, 0, 1) data1 <- data.frame(x, y1, y2)
原始绘图代码
p <- data1 %>% ggplot() p + geom_line(aes(x, y1), linetype = 2) + geom_line(aes(x, y2)) + geom_line(aes(x, y= 0)) + geom_text(aes(x = 0, y = -0.05, label = "Party A"), nudge_x = 0.5) + geom_text(aes(x = 0, y = -0.05, label = "Party B"), nudge_x = - 0.5) + xlab("Ideological scale: Left to Right") + ylab("Probability")
解决方案
要生成符合需求的图例,核心是让ggplot识别到线型(linetype)与分组的映射关系,推荐两种实现方式:
方式1:转换为长格式数据(ggplot推荐规范)
将宽格式数据转为长格式,新增分组列标识Party A和Party B,后续维护更方便:
library(tidyverse) # 转换数据格式为长格式 data_long <- data1 %>% pivot_longer(cols = c(y1, y2), names_to = "party", values_to = "probability") %>% mutate(party = case_when( party == "y1" ~ "Party A", party == "y2" ~ "Party B" )) # 绘图并配置图例 ggplot(data_long, aes(x = x, y = probability, linetype = party)) + geom_line() + geom_hline(yintercept = 0) + # 替代原代码中画y=0的geom_line,更简洁 scale_linetype_manual( name = "Party", # 图例标题 values = c("Party A" = 2, "Party B" = 1) # 指定虚线对应Party A,实线对应Party B ) + xlab("Ideological scale: Left to Right") + ylab("Probability")
方式2:直接在原代码基础上调整(快速修改)
无需转换数据格式,直接将linetype放入aes()中并手动指定映射:
library(tidyverse) ggplot(data1) + geom_line(aes(x, y1, linetype = "Party A")) + geom_line(aes(x, y2, linetype = "Party B")) + geom_hline(yintercept = 0) + scale_linetype_manual( name = "Party", values = c("Party A" = 2, "Party B" = 1) ) + xlab("Ideological scale: Left to Right") + ylab("Probability")
关键说明
- 两种方式都通过
scale_linetype_manual自定义线型与分组的对应关系,确保图例显示正确 - 方式1更符合ggplot的"整洁数据"设计原则,新增组别时只需修改数据转换部分,无需调整绘图代码
- 可以根据需求保留或移除原代码中的底部文本标注,不影响图例生成
内容的提问来源于stack exchange,提问作者Victor Shin
相关产品推荐
相关产品推荐

