ggplot图例调整问题:如何让图例显示正确线型与颜色
解决ggplot图例同时显示颜色和线型的问题
修复后的代码
library(tidyverse) ggplot(data.frame(x = c(-3,3)), aes(x = x))+ stat_function(fun=dnorm, aes(color="mean 2", linetype="mean 2"), linewidth = 1.5, args = list(mean = 2))+ stat_function(fun=dnorm, aes(color="mean 0", linetype="mean 0"), linewidth = 1.5, args = list(mean = 0))+ scale_color_manual(values = c("mean 2" = "red", "mean 0" = "blue"), name = "Mean")+ scale_linetype_manual(values = c("mean 2" = 1, "mean 0" = 2), name = "Mean")+ guides(color = guide_legend(override.aes = list(linewidth = 1.5))) # 可选:让图例线条粗细和绘图一致
效果说明
修改后图例会同时展示每个分组对应的颜色和线型,且两者共用同一个图例标题"Mean",不会出现拆分的图例。
原代码失败原因
你之前的代码里,linetype是作为stat_function的独立参数设置的,没有放到aes()美学映射中。ggplot的图例仅对通过aes()映射的属性生效,直接设置的linetype只是给线条指定样式,不会和图例建立关联,因此最后一行的scale_linetype_manual找不到对应的映射对象,自然无法生效。
更简洁的写法(可选)
如果不想重复编写分组名称,可以先构造包含参数的数据框,再结合分组映射实现,代码更易维护:
library(tidyverse) dist_params <- tibble( mean_val = c(2, 0), color = c("red", "blue"), linetype = c(1, 2), group = c("mean 2", "mean 0") ) ggplot(data.frame(x = c(-3,3)), aes(x = x))+ stat_function(data = dist_params, aes(color = group, linetype = group), fun = dnorm, linewidth = 1.5, args = function(row) list(mean = row$mean_val))+ scale_color_manual(values = set_names(dist_params$color, dist_params$group), name = "Mean")+ scale_linetype_manual(values = set_names(dist_params$linetype, dist_params$group), name = "Mean")
内容的提问来源于stack exchange,提问作者kpr62
相关产品推荐
相关产品推荐

