如何为双轴ggplot图表添加图例?
ggplot双轴图添加图例的解决方案
你的代码里图例不显示的核心原因是:所有元素的颜色、填充都是直接硬编码赋值(比如fill = "green3"),没有通过aes()建立变量映射关系——ggplot只有检测到美学映射时才会自动生成图例。直接把颜色塞进aes()会导致逻辑混乱,正确的做法是先整理数据格式,再统一设置映射:
解决步骤及修改后代码
1. 转换数据为长格式
把Prediction和Actual列合并成一列,新增分组列(比如type),这样可以用同一组geom_line和geom_point绘制两组数据,自动生成映射:
2. 统一设置美学映射
在aes里指定color、fill、shape与分组变量的映射,再用scale_*_manual手动设置对应样式,同时处理双轴和柱状图的图例:
library(ggplot2) library(tidyr) # 示例数据 data <- data.frame(group = LETTERS[1:5], pol_nb = c(1000, 800, 1200, 900, 800), Prediction = c(0.6, 0.9, 0.9, 0.5, 0.8), Actual = c(0.5, 1.0, 1.2, 1.5, 0.9)) buffer <- 0.5 scale <- max(data$Prediction)/max(data$pol_nb) total <- sum(data$pol_nb) # 转换为长格式 data_long <- pivot_longer(data, cols = c(Prediction, Actual), names_to = "type", values_to = "value") ggplot() + # 绘制折线和点(统一映射分组) geom_line(data = data_long, aes(x = group, y = value, color = type, group = type), linewidth = 1) + geom_point(data = data_long, aes(x = group, y = value, fill = type, shape = type), size = 3, color = "black") + # 绘制柱状图 geom_col(data = data, aes(x = group, y = pol_nb * buffer * scale, fill = "Policies"), color = "black", width = 0.5) + # 设置Y轴双轴 scale_y_continuous( name = "Prediction", sec.axis = sec_axis(~ ./ (buffer * scale * total), name = 'PoliciesDistribution', labels = scales::label_percent())) + # 手动指定颜色、填充、形状 scale_color_manual(values = c("Prediction" = "green3", "Actual" = "purple", "Policies" = "gold")) + scale_fill_manual(values = c("Prediction" = "green3", "Actual" = "purple", "Policies" = "gold")) + scale_shape_manual(values = c("Prediction" = 21, "Actual" = 22, "Policies" = NA)) + # 调整图例(隐藏形状的NA项,统一图例标题) guides( shape = guide_legend(override.aes = list(shape = c(21,22,NA))), color = guide_legend(title = "Category"), fill = guide_legend(title = "Category") ) + theme_light()
关键改动说明
- 将宽格式数据转长格式,让
Prediction和Actual共享同一组geom,避免重复代码,同时自然生成分组映射 - 把所有需要图例的元素(折线、点、柱状图)的
color/fill都放到aes()里,用分组变量或固定字符串(比如"Policies")建立映射 - 用
scale_*_manual统一设置各分组的颜色、填充、形状,确保图例样式与图表一致 - 通过
guides()调整图例显示,隐藏柱状图不需要的形状符号,统一图例标题
内容的提问来源于stack exchange,提问作者Patrick Jung
相关产品推荐
相关产品推荐

