如何在ggplot中将指定分类设为灰色并保证图例颜色匹配
问题原因
你的代码存在两个核心问题导致图例颜色不匹配:
- 你给
Unknown分组的点没有指定点形状,默认使用的是不需要fill属性的实心点(pch=16),你单独设置的color='grey'没有和全局的fill=pop映射绑定,图例无法识别这个单独设置的颜色 - 两个点图层的美学映射规则不一致,图例只会继承全局映射的默认配色,不会自动匹配你给单个数据集设置的固定颜色
解决方法
你只需要统一两个图层的点形状,再通过scale_fill_manual手动指定Unknown分类的填充色即可,修改后的可复现代码如下:
library(ggplot2) bgrd <- iris[iris$Species == 'virginica',] ref <- iris[iris$Species != 'virginica',] p <- ggplot() + # 统一使用带边框的填充点pch=21,保证都走fill映射 geom_point(data=bgrd, aes(x=Sepal.Length, y=Sepal.Width, fill=Species), pch=21, color='grey') + geom_point(data=ref, aes(x=Sepal.Length, y=Sepal.Width, fill=Species), pch=21, color='black') + # 手动指定各分类的fill颜色,这里把对应Unknown的virginica设为灰色 scale_fill_manual(values = c("setosa" = "#F8766D", "versicolor" = "#00BA38", "virginica" = "grey")) p
对应到你的实际业务场景,修改后的代码如下:
library(data.table) library(ggplot2) data <- fread(data_path) bgrd <- data[data$pop == 'Unknown',] ref <- data[data$pop != 'Unknown',] p <- ggplot() + geom_point(data = bgrd, aes(x = PC1, y = PC2, fill = pop), pch = 21, color = 'grey') + geom_point(data = ref, aes(x = PC1, y = PC2, fill = pop), pch = 21, color = 'black') + # 仅固定Unknown分类的颜色,其余分类自动使用默认配色 scale_fill_manual(values = c("Unknown" = "grey"), limits = force) p
内容的提问来源于stack exchange,提问作者curious
相关产品推荐
相关产品推荐

