如何在ggplot2中仅为特定阈值上下的点着色?
解决方案
你可以通过分图层绘制点来实现需求:先绘制中间区域的灰色点,再分别绘制上下阈值外的、保留物种颜色的点,具体代码如下:
color_above <- mean(iris$Sepal.Width) + sd(iris$Sepal.Width) color_below <- mean(iris$Sepal.Width) - sd(iris$Sepal.Width) # 获取ggplot默认的物种配色,保证和原代码颜色一致 species_colors <- scales::hue_pal()(3) names(species_colors) <- unique(iris$Species) ggplot(data=iris, aes(x = Sepal.Length, y = Sepal.Width)) + # 绘制中间阈值内的灰色点 geom_point(data = subset(iris, Sepal.Width >= color_below & Sepal.Width <= color_above), aes(shape = Species), color = "gray50") + # 绘制阈值上方的点,保留物种颜色 geom_point(data = subset(iris, Sepal.Width > color_above), aes(shape = Species, color = Species)) + # 绘制阈值下方的点,保留物种颜色 geom_point(data = subset(iris, Sepal.Width < color_below), aes(shape = Species, color = Species)) + # 指定物种对应的颜色 scale_color_manual(values = species_colors) + xlab("Sepal Length") + ylab("Sepal Width") + geom_hline(yintercept = color_above, linetype = "dashed", color = "black") + geom_hline(yintercept = color_below, linetype = "dashed", color = "black")
说明
- 先提取ggplot默认的3种物种配色,确保上下点的颜色和原代码效果一致;
- 通过
subset筛选不同区域的数据,分图层绘制:中间区域的点统一设为灰色,上下区域的点保留原有的物种颜色和形状映射; - 这种方式不需要额外创建映射变量,完全符合你“不使用aes(color = x)”的要求。
内容的提问来源于stack exchange,提问作者purple1437
相关产品推荐
相关产品推荐

