如何在scale_fill_stepsn()中设置非对称断点及指定区间对应颜色?
解决阶梯渐变区间纯颜色映射问题
你遇到的颜色混合问题,是因为values=scales::rescale(val_breaks)让颜色在断点之间平滑过渡了。要实现每个区间固定单一颜色、无渐变混合的效果,有两种直接的解决方法:
方法一:离散化变量后手动映射颜色
把连续的qsec变量用cut分成指定区间,再用手动颜色映射指定每个区间的颜色,逻辑清晰且效果准确:
library(tidyverse) val_breaks = c(0, 15, 18, 20, 25) col_breaks = c("red", "blue", "yellow", "purple") mtcars %>% # 把qsec按断点分组,include.lowest确保0值被包含在第一个区间 mutate(qsec_group = cut(qsec, breaks = val_breaks, include.lowest = TRUE)) %>% ggplot(aes(x = mpg, y = wt, color = qsec_group)) + geom_point(size = 3) + # 手动指定每个区间对应的颜色 scale_color_manual(values = col_breaks) + labs(color = "qsec区间")
如果是fill美学需求,只需把color替换为fill,scale_color_manual替换为scale_fill_manual即可。
方法二:直接用scale_stepsn实现无渐变区间色
如果不想修改原始数据,可调整scale_color_stepsn的参数,用区间中点对应颜色位置,让每个区间内颜色保持一致:
library(tidyverse) val_breaks = c(0, 15, 18, 20, 25) col_breaks = c("red", "blue", "yellow", "purple") # 计算每个区间的中点,作为颜色映射的锚点 mid_points = (val_breaks[-1] + val_breaks[-length(val_breaks)])/2 mtcars %>% ggplot(aes(x = mpg, y = wt, color = qsec)) + geom_point(size = 3) + scale_color_stepsn( colors = col_breaks, breaks = val_breaks, limits = c(0,25), # 用区间中点的归一化值指定颜色位置 values = scales::rescale(mid_points), # 显示阶梯式图例 guide = "colorsteps", # 保留超出范围值的颜色(如果有) oob = scales::oob_keep )
同样,替换为fill需求时,将scale_color_stepsn改为scale_fill_stepsn即可。
内容的提问来源于stack exchange,提问作者Dan Chaltiel
相关产品推荐
相关产品推荐

