如何合并ggplot中scale_shape_manual命名向量对应的颜色与形状图例
解决方案
两个标度能够合并为同一个图例的核心前提是二者的breaks(图例项)内容、顺序完全匹配,你当前的问题是scale_shape_manual使用命名向量传值时,默认生成的breaks顺序和颜色标度默认的因子水平顺序不一致,即使设置了相同的图例名称也无法合并。
你只需要在原有代码的scale_shape_manual中新增limits参数,显式指定为映射变量的因子水平即可,完全不影响你使用scale_colour_brewer等颜色标度函数:
library(ggplot2) data(penguins, package = "palmerpenguins") ggplot(penguins, aes(x = body_mass_g, y = bill_length_mm, colour = species, shape = species)) + geom_point() + scale_shape_manual(values = c(Adelie = 17, Gentoo = 16, Chinstrap = 6), limits = levels(penguins$species)) # 仅需新增这一行参数
如果你需要搭配颜色调色盘函数,直接添加对应标度即可,比如:
ggplot(penguins, aes(x = body_mass_g, y = bill_length_mm, colour = species, shape = species)) + geom_point() + scale_shape_manual(values = c(Adelie = 17, Gentoo = 16, Chinstrap = 6), limits = levels(penguins$species)) + scale_colour_brewer(palette = "Set2") # 可以正常使用brewer调色盘
可选替代方案
如果你不想额外设置limits,也可以直接按映射变量的因子水平顺序传入形状值,不需要命名向量:
# penguins$species的默认因子顺序为 Adelie → Chinstrap → Gentoo,按顺序赋值即可 scale_shape_manual(values = c(17, 6, 16))
这种方案也可以自动合并图例,缺点是需要提前确认变量的因子顺序,不如命名向量的方式可读性强、不容易写错映射关系。

内容的提问来源于stack exchange,提问作者Richard Telford
相关产品推荐
相关产品推荐

