You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在ggplot2中实现趋势线高饱和配色、散点同色系非透明低饱和配色的方法问询

在ggplot2中实现趋势线高饱和配色、散点同色系非透明低饱和配色的方法问询

嘿,太懂你这种纠结了!用alpha确实会遇到重叠点发灰发虚的问题,而且线条和点的透明度表现还不一致,确实闹心。咱们直接从颜色本身的饱和度入手调整就行,完全不用碰透明度,完美解决你的需求~

最省心的方法:用after_scale()直接调整颜色饱和度(推荐)

如果你用的是ggplot2 3.4.0及以上的版本,直接用after_scale()函数在图层里调整颜色饱和度就行,不用手动提取调色板,自动对应每个分组的颜色:

library(tidyverse)
library(colorspace)

diamonds %>%
  filter(color %in% LETTERS[4:6]) %>%
  ggplot(aes(x = as.numeric(cut), y = price, colour = color)) +
  # 趋势线用原始高饱和配色
  geom_smooth(method = "lm", se = FALSE, linewidth = 1.2) +
  # 散点用同色系低饱和配色,用after_scale直接降饱和度,完全不用alpha
  geom_point(aes(colour = after_scale(desaturate(colour, amount = 0.5))), size = 2) +
  scale_colour_brewer(palette = "Set2") +
  theme_classic()

关键细节说明:

  • after_scale()是ggplot2的新特性,能在颜色完成映射后,对每个分组的颜色做批量调整,这里用colorspace::desaturate()来降低饱和度
  • amount参数可以自己调:0是完全饱和(和原始色一样),1是完全去饱和成灰色,我这里用了0.5,你可以改成0.3或者0.6,直到调出你想要的浅淡程度
  • 这样出来的散点是实色低饱和,完全没有透明度,重叠点只会是同色叠加,不会出现发灰发虚的问题,趋势线还是鲜艳的高饱和色,完美对应你想要的效果

如果你还是想用你原来代码里的stat_summary(比如画均值点),只需要把geom_point换成对应的stat_summary就行:

stat_summary(fun = mean, geom = "point", 
             aes(colour = after_scale(desaturate(colour, amount = 0.5))), 
             size = 3, shape = 16)

兼容旧版ggplot2的方法:手动提取调色板调整

如果你用的ggplot2版本比较旧,没有after_scale(),那咱们手动提取调色板颜色,分别给线条和点指定:

library(tidyverse)
library(RColorBrewer)
library(colorspace)

# 先提取Set2调色板的3个高饱和颜色(对应你的3个color类别)
saturated_cols <- brewer.pal(3, "Set2")
# 生成对应的低饱和颜色
desaturated_cols <- desaturate(saturated_cols, amount = 0.5)

diamonds %>%
  filter(color %in% LETTERS[4:6]) %>%
  mutate(color = factor(color, levels = LETTERS[4:6])) %>%
  ggplot() +
  # 趋势线用高饱和色
  geom_smooth(aes(x = as.numeric(cut), y = price, colour = color), 
              method = "lm", se = FALSE, linewidth = 1.2) +
  # 散点用低饱和色,手动对应每个分组
  geom_point(aes(x = as.numeric(cut), y = price, colour = color), 
             size = 2) +
  # 手动指定配色:图例显示高饱和色(和趋势线一致),散点用低饱和色
  scale_colour_manual(
    values = setNames(desaturated_cols, LETTERS[4:6]),
    guide = guide_legend(override.aes = list(colour = saturated_cols))
  ) +
  theme_classic()

效果说明

不管用哪种方法,最终出来的图都是:

  • 趋势线是你选的Set2高饱和鲜艳配色
  • 散点是同色系的低饱和实色,完全没有透明度,重叠点只会是同色叠加,不会出现alpha导致的发灰问题
  • 线条和点的颜色属于同一色系,视觉上统一协调,又能突出趋势线的重点

备注:内容来源于stack exchange,提问作者user2390246

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 13:39:38