R语言ggplot2绘图如何设置图例显示对应线条线型
问题说明
使用ggplot2绘制多系列折线图时,若线型参数未做美学映射,图例不会同步显示各系列对应的线型差异,当前效果如下:
问题根因
原代码中linetype作为固定参数写在aes()函数外部,没有和系列名称做绑定映射,ggplot2仅会将aes()内部声明的视觉属性同步到图例,因此图例中所有线条均显示为默认实线。
修复方案
- 将每个
geom_line()层的linetype移入aes()内部,与color参数一样绑定到对应系列名 - 新增
scale_linetype_manual()函数,统一配置每个系列对应的线型,保证图中线条与图例显示一致 - 在
labs()中为线型图例设置与颜色图例相同的标题,让两个图例自动合并为一个,避免重复
修改后可直接运行的代码
library(ggplot2) library(reshape2) # 预定义各系列颜色 colors <- c("SK H" = "blue", "LV H" = "blue", "IE H" = "blue", "SK M" = "red", "LV M" = "red", "IE M" = "red") # 预定义各系列线型,与原代码设置完全对应 line_types <- c("SK H" = "twodash", "LV H" = "solid", "IE H" = "dotted", "SK M" = "twodash", "LV M" = "solid", "IE M" = "dotted") p3 <- ggplot(EV, aes(x = Anos)) p3 + geom_line(aes(y = SK.H, color = "SK H", linetype = "SK H"), size = 1.5) + geom_line(aes(y = LV.H, color = "LV H", linetype = "LV H"), size = 1.5) + geom_line(aes(y = IE.H, color = "IE H", linetype = "IE H"), size = 1.5) + geom_line(aes(y = SK.M, color = "SK M", linetype = "SK M"), size = 1.5) + geom_line(aes(y = LV.M, color = "LV M", linetype = "LV M"), size = 1.5) + geom_line(aes(y = IE.M, color = "IE M", linetype = "IE M"), size = 1.5) + ggtitle("EV between 2002 e 2019") + # 合并原代码中两个重复的主题设置 theme(plot.title = element_text(hjust = 0.5, face = "bold")) + # 给color和linetype设置相同的图例名,触发自动合并 labs(x = "Anos", y = "EV", color = "Legend", linetype = "Legend") + scale_color_manual(values = colors) + # 新增线型映射配置,让图例正确显示线型 scale_linetype_manual(values = line_types)
注意事项
- 原代码中LV H、LV M两个系列未手动指定线型,默认使用
solid实线,上述代码中线型映射已对应匹配,不会改变原图的线条样式 - 若后续需要调整线型,仅需修改
line_types向量中的对应值即可,无需逐层修改geom_line()参数
内容的提问来源于stack exchange,提问作者CC-SAM
相关产品推荐
相关产品推荐

