如何为ggplot2绘制的双折线图手动添加自定义图例
实现核心逻辑
ggplot要生成对应图例,必须把视觉参数(颜色、线型、形状等)放到aes()里做映射,写在aes()外面的固定样式参数,是不会被纳入图例生成逻辑的。你当前代码把颜色、线型全写在aes()外面,自然没法自动带出对应标注,只要把分组标识移到aes()内部,再手动指定每个分组对应的实际视觉样式,就能生成符合要求的自定义图例。
可直接复用的代码
ggplot() + # 在aes内部直接绑定color和linetype的分组标识 geom_line(data = df_density0, aes(x = x, y = y, color = "Target = 0", linetype = "Target = 0")) + geom_line(data = df_density1, aes(x = x, y = y, color = "Target = 1", linetype = "Target = 1")) + # 手动指定每个分组对应的实际颜色 scale_color_manual( name = NULL, # 设为NULL可隐藏图例顶部的多余标题 values = c( "Target = 0" = "darkred", "Target = 1" = "steelblue" ) ) + # 手动指定每个分组对应的实际线型 scale_linetype_manual( name = NULL, values = c( "Target = 0" = "solid", "Target = 1" = "twodash" ) ) + xlab('') + ylab('Density')
实现细节说明
- 这里
aes()里写的字符串"Target = 0"、"Target = 1"是临时的分组映射标识,不需要存在于你的原始数据里,作用是把两条折线的颜色、线型和对应的图例分类绑定 - 因为颜色、线型两个映射用了完全一样的分组标签、一样的图例标题(设为NULL),ggplot会自动把两个分散的图例合并成同一个,不会出现两个独立的图例块
- 后续要调整图例位置、大小、边框样式,直接在链式代码里加
theme(legend.xxx = ...)参数即可,比如把图例放到图内左上角就写theme(legend.position = c(0.1, 0.9))
容易踩的坑
- 记得把原来写在
aes()外面的color、linetype固定参数删掉,这类参数会覆盖aes()里的映射效果,和图例体系完全割裂,哪怕后续手动调整图例相关参数,也没法匹配到你要的标注关系 - 别在
scale_color_manual和scale_linetype_manual里设置不一样的图例标题,不然ggplot会把这两个识别成独立图例,分别展示颜色、线型的对应关系,和你想要的单图例效果不一致
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

