在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
相关产品推荐
相关产品推荐

