ggplot2图例点显示全黑与绘图颜色不匹配的问题如何解决
问题产生原因
你使用的21、22号形状属于带边框的填充类点形状,这类形状的边框色由color参数控制,内部填充色由fill参数控制,图例全黑是两个设置冲突导致的:
- 你在
geom_point层固定了全局color = "black",ggplot的图例默认会继承图层的所有固定美学参数 - 你同时独立映射了
fill(对应Species图例)和shape(对应Size图例)两个美学维度,ggplot默认不会在Size图例中继承fill的映射规则,导致Size图例的点默认用黑色填充;而Species图例默认的展示形状不是填充型,填充色无法正常显示,最终两个图例看起来都是全黑的。
修复方案
方案1:保留现有带黑边框的点样式
仅需在现有代码末尾追加guides配置,强制图例正确展示填充和边框属性即可:
my_plot + guides( # 调整Species图例:用21号填充形,边框为黑色 fill = guide_legend(override.aes = list(shape = 21, color = "black")), # 调整Size图例:用灰色填充避免全黑,边框为黑色 shape = guide_legend(override.aes = list(fill = "gray70", color = "black")) )
如果你希望两个图例合并展示,只需要把scale_fill_manual和scale_shape_manual的name参数设置为相同值即可。
方案2:简化样式无需边框
如果不需要点带黑色边框,直接调整映射规则更简单,修改以下几处代码即可:
- 将
iris_mapping里的fill改为color - 将
scale_fill_manual改为scale_color_manual - 将
scale_shape_manual的取值改为普通无填充形状(如16、17) - 删除
geom_point里的color = "black"参数
修改后的核心代码片段如下:
iris_mapping <- aes_string( color = "Species", shape = "Size" ) my_plot <- ggplot(iris, aes(x = Petal.Length, y = Petal.Width)) + geom_point(iris_mapping, size = 4, alpha = 0.9) + theme_bw() + theme( plot.title = element_text(hjust = 0.5), legend.text = element_text(family = "mono", face = "bold") ) + scale_color_manual( values = fgplots::brew_fg_colors(length(unique(iris$Species))), name = "Species" ) + scale_shape_manual( name = "Size", values = c(16, 17) ) + xlab("Petal.Length") + ylab("Petal.Width")
内容的提问来源于stack exchange,提问作者icedcoffee
相关产品推荐
相关产品推荐

