如何在R的ggplot2中自定义折线图图例,合并线型与颜色?
解决ggplot2折线图图例合并问题
你的问题根源在于当前代码用多个geom_line分别定义颜色和线型映射,导致ggplot把颜色、线型当成两个独立的图例。要实现颜色+线型合并的图例,最简洁的方法是先把宽格式数据转成长格式,再用同一个变量同时映射颜色和线型。
步骤1:转换数据格式(宽→长)
用tidyr包的pivot_longer把分散的列合并成统一的类别列,这是ggplot2的最佳实践,能大幅简化代码:
library(tidyr) library(ggplot2) # 将宽格式数据转为长格式 df_long <- df7Q2 %>% pivot_longer( cols = -REF_DATE, # 保留日期列,转换其余所有增长率列 names_to = "Category", # 新列:存储类别(如Shelter_M、Energy_Y) values_to = "Growth" # 新列:存储CPI增长率数值 )
步骤2:绘制合并图例的折线图
现在只需要一个geom_line,将color、linetype、group都绑定到同一个Category变量,ggplot会自动合并图例:
ggplot(df_long, aes(x = REF_DATE)) + geom_line(aes(y = Growth, color = Category, linetype = Category, group = Category), size = 1.5) + # 自定义颜色,和你原代码的设置一致 scale_color_manual( values = c( "Shelter_M" = "#26495c", "Energy_M" = "#c4a35a", "Food_M" = "#c66b3d", "Shelter_Y" = "#26495c", "Energy_Y" = "#c4a35a", "Food_Y" = "#c66b3d" ) ) + # 自定义线型,和你原代码的设置一致 scale_linetype_manual( values = c( "Shelter_M" = "dashed", "Energy_M" = "dashed", "Food_M" = "dashed", "Shelter_Y" = "solid", "Energy_Y" = "solid", "Food_Y" = "solid" ) ) + labs( title = "Shelter、Energy、Food的CPI月环比与同比增长率对比", x = "月份", y = "消费者价格指数增长率" ) + theme( plot.title = element_text(hjust = 0.5), legend.key.width = unit(2, "cm") )
效果说明
这样设置后,图例会自动合并为一个,每个条目同时显示对应的颜色和线型:
- Shelter_M:深灰色虚线
- Energy_M:橄榄色虚线
- Food_M:橙色虚线
- Shelter_Y:深灰色实线
- Energy_Y:橄榄色实线
- Food_Y:橙色实线
原代码里的scale_size因为没有实际作用(已经在geom_line里固定了size=1.5),所以直接删掉即可。
内容的提问来源于stack exchange,提问作者Kivan Ilangakoon
相关产品推荐
相关产品推荐

