ggplot2中颜色与点形状图例重复问题及合并需求
解决ggplot双图例合并问题
你的图表出现两个图例,核心问题是geom_line里的额外颜色映射导致图例分裂,同时shape、size、color三个美学属性的图例未统一合并。以下是修正后的代码,可实现单图例效果:
修正后的绘图代码
plot <- ggplot(data, aes(x = run, y = no2c, color = sample, shape = sample, size = sample)) + labs(title = expression(paste("C"))) + xlab("Run number") + ylab(expression(paste("NO"[2], " (mg " ~L^-1*'', ")"))) + geom_point() + # 统一size映射的图例名称与标签 scale_size_manual(name = "Sample", labels = c("Analyser", "Grab"), values = c(F = 2, G = 4)) + # 移除额外颜色映射,直接指定线条颜色避免生成多余图例 geom_line(color = "black", data = subset(data, sample == 'F')) + scale_x_continuous(breaks = seq(65,70,1), limits = c(65,70)) + scale_y_continuous(breaks = seq(0,0.6,0.1), limits = c(0,0.6)) + theme_bw() + theme(panel.border = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"), axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1), text = element_text(size=12), panel.border = element_rect(colour = "black", fill=NA, size=0.5), legend.position = "bottom", legend.title = element_text(size=12), legend.text = element_text(size=12), axis.title.y = element_text(size=12), plot.title = element_text(size=14, face="bold")) + scale_color_manual(name = "Sample", labels = c("Analyser", "Grab"), values = c("F"="black", "G"="red3")) + # 强制合并三个美学属性的图例 guides(color = guide_legend(title = "Sample"), shape = guide_legend(title = "Sample"), size = guide_legend(title = "Sample"))
关键修改说明
- 将
shape和size映射移至全局aes中,让三个美学属性(color/shape/size)均绑定到sample变量,为合并图例提供统一基础。 - 删除
geom_line中的aes(color="no2c"),直接用color="black"指定线条颜色,避免生成额外的颜色图例。 - 给
scale_size_manual设置与scale_color_manual一致的名称和标签,确保三个尺度的图例信息统一。 - 通过
guides()明确指定三个图例共用同一标题,强制ggplot合并为单个图例。
修改后图表会显示一个名为“Sample”的图例,包含“Analyser”(黑色小圆圈)和“Grab”(红色大三角形)两个条目,完全符合需求。
内容的提问来源于stack exchange,提问作者MGB
相关产品推荐
相关产品推荐

