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

ggplot绘制图表图例未显示问题求助

解决ggplot图表图例不显示的问题

你的ggplot图表无法显示图例,核心原因有三个:一是图层的颜色属性未在aes()内映射(直接赋值颜色会让ggplot跳过图例生成);二是图例位置设置超出了绘图区域;三是当前宽格式数据不符合ggplot的映射逻辑。以下是具体修正方案:

修正步骤与完整代码

1. 准备工作:加载依赖包并转换数据格式

先把宽格式数据转成长格式,方便统一映射图例属性:

library(ggplot2)
library(tidyr)
library(ggtext) # 用于解析带样式的标题

# 将宽格式数据转为长格式,合并两条曲线的数值列
fig4_long <- fig4 %>%
  pivot_longer(
    cols = c(complete_preds_means, contrafact),
    names_to = "series",
    values_to = "value"
  )

2. 修正后的绘图代码

plot_fig4 <- ggplot(fig4, aes(x = dias)) +
  # 映射color到series变量,让ggplot自动生成曲线图例
  geom_smooth(
    data = fig4_long, 
    aes(y = value, color = series), 
    span = 0.1, se = FALSE, size = 1
  ) +
  # 映射fill到自定义标签,生成置信区间的图例
  geom_ribbon(
    aes(ymin = complete_preds_lower, ymax = complete_preds_upper, fill = "PVPC 置信区间"), 
    alpha = 0.2
  ) +
  # 设置图表标签与图例标题
  labs(
    title = "<span style='color: #9a6584;'>Gràfic 2. </span><span style='color: black;'>Evolució del PVPC i de l'estimada sense el topall del gas</span>", 
    y = "",
    x = "", 
    caption = "Font: Hidalgo, M. et al. (2022)",
    color = "数据系列",
    fill = "置信区间"
  ) +
  # 手动指定自定义颜色与图例标签
  scale_color_manual(
    values = c("complete_preds_means" = "#9a6584", "contrafact" = "#000000"),
    labels = c("PVPC 估计值", "无天然气限制的估计")
  ) +
  scale_fill_manual(
    values = c("PVPC 置信区间" = "#9a6584")
  ) +
  scale_y_continuous(breaks = seq(from = 100, to = 900, by = 100)) +
  scale_x_date(expand = c(0, 0), date_breaks = "1 month", date_labels = "%b\n%Y") +
  geom_vline(xintercept = as.numeric(as.Date("2022-06-13")), linetype = 2, color = "black") +
  theme_minimal() +
  theme(
    plot.background = element_rect(fill = "transparent", colour = NA),
    panel.background = element_rect(fill = "transparent", colour = NA),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.grid.major.y = element_line(color = "grey80"),
    plot.title = element_markdown(hjust = 0, size = 15, face = "bold"),
    plot.caption = element_text(hjust = 0, size = 12),
    strip.text.x = element_text(size = 15),
    axis.line.x = element_line(color = "black"),
    axis.line.y = element_line(color = "black"),
    axis.text.x = element_text(size = 12),
    axis.text.y = element_text(size = 12),
    axis.title.x = element_text(size = 10, face = "bold",
                                margin = margin(t = 12, b = 0, r = 11, l = 5)),
    axis.title.y = element_text(size = 10, face = "bold",
                                margin = margin(t = 0, b = 0, r = 11, l = 5)),
    legend.position = c(0.2, 0.8), # 调整到绘图区域内的可见位置(坐标范围0-1)
    legend.text = element_text(size = 12),
    legend.background = element_rect(fill = "transparent")
  )

print(plot_fig4)

关键修改说明

  • 数据格式转换:长格式数据让ggplot可以通过series变量统一映射曲线的颜色属性,自动生成图例
  • 美学映射调整:将color、fill属性移入aes()内部,告诉ggplot这些是需要生成图例的映射项
  • 图例位置修正:把legend.position从c(5,5)(超出绘图区域)改为c(0.2,0.8),确保图例可见
  • 自定义颜色与标签:通过scale_color_manual和scale_fill_manual指定颜色与图例文字,让图表更清晰

内容的提问来源于stack exchange,提问作者Maria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:40:26