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
相关产品推荐
相关产品推荐

