如何在ggplot2中通过scale_gradientn实现无间距类离散连续色阶?
实现无间距离散色阶的解决方案
当然可以搞定这个需求!你想要的是没有层级间距的离散色块效果,同时保留连续色阶标签位置精准的优势——其实不用靠那种“伪陡峭渐变”的迂回方法,ggplot2里有专门的工具能直接实现。
问题根源
你之前用scale_gradientn的思路之所以会出现颜色过渡,是因为它本质还是个连续渐变比例尺,哪怕把values设得非常接近,渲染引擎还是会在两个值之间生成过渡色。而我们需要的是把连续变量直接切成无过渡的离散色块,这时候scale_fill_stepsn就是最佳选择。
最优解决方案代码
library(ggplot2) ggplot(faithfuld, aes(waiting, eruptions)) + geom_raster(aes(fill = density)) + scale_fill_stepsn( # 指定每个离散区间的颜色,数量和区间数一致 colours = c("red", "green", "blue", "yellow"), # 设置区间分界点,3个分界点对应4个区间 breaks = c(0.025, 0.05, 0.075), # 根据数据实际范围设置极限值(faithfuld的density在0到0.1左右) limits = c(0, 0.1), # 可选:自定义每个区间的标签 labels = c("低密度", "中密度", "高密度", "极高密度"), # 显示首尾的极限值标签 show.limits = TRUE )
关键参数说明
scale_fill_stepsn专门用于将连续变量拆分为无颜色过渡的离散区间,每个区间对应单一颜色,完美解决你之前的层级间距和过渡问题。colours的数量要和最终的区间数匹配:比如你要4个颜色,就对应4个区间,需要设置3个breaks分界点。- 如果不想手动设置
breaks,可以用n.breaks参数直接指定分界点数量,比如n.breaks = 3同样会生成4个区间。
备选方案(坚持用gradientn的思路)
如果你非要用scale_gradientn来实现,也可以通过重复颜色并设置完全重合的values来强制消除过渡:
ggplot(faithfuld, aes(waiting, eruptions)) + geom_raster(aes(fill = density)) + scale_fill_gradientn( colours = rep(c("red", "green", "blue", "yellow"), each = 2), values = c(0, 0.25, 0.25, 0.5, 0.5, 0.75, 0.75, 1) )
不过这个方法不如scale_fill_stepsn直观,也不是官方推荐的用法,更建议优先用前者。
内容的提问来源于stack exchange,提问作者AF7
相关产品推荐
相关产品推荐

