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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:26:10