R语言ggplot2设置scale_fill_gradient2非对称断点与颜色映射问题
ggplot2热图自定义非对称色阶实现方案
需求说明
需实现如下规则的非对称相对丰度色阶:
- 0~0.0005区间:黑色渐变到深绿色
- 0.0005~0.001区间:深绿色渐变到绿色
- 0.001~1区间:固定为绿色,且该区间在图例色谱中仅占极小比例
此前尝试使用scale_fill_gradientn和scale_fill_gradient2两种方案,均无法达到预期的色阶占比效果。
实现代码
核心逻辑是通过scale_fill_gradientn的values参数自定义数值断点和色条长度的映射关系,而非使用默认的线性映射:
library(ggplot2) library(scales) # 基础热图绘制 g <- ggplot(data = df, aes(x=Sample_ID, y=Taxonomy, fill=Relative_abundance)) + geom_tile(width=0.95, height=0.95) + theme(axis.title=element_blank()) + theme(panel.background = element_blank(), legend.position="left", plot.margin=unit(c(1,-0.1,1,1), "cm")) # 自定义非对称色阶 g + scale_fill_gradientn( colors = c("black", "darkgreen", "green", "green"), # 自定义数值断点对应色条的位置:0~0.001占色条前91%长度,0.001~1仅占最后9% values = rescale(c(0, 0.0005, 0.001, 1), to = c(0, 0.45, 0.91, 1)), limits = c(0, 1), # 超出范围的数值自动截断到边界,避免出现灰色块 oob = oob_squish, name = "Relative abundance" )
参数说明
- 新增
0.001作为数值断点,搭配两个相同的green颜色参数,实现大于0.001的数值全部显示为固定绿色的效果 values中的to参数可自由调整各区间在色条上的占比:如果需要0.001以上区间占比更小,可将0.91的数值改大,例如改为0.95则0.001~1区间仅占色条最后5%的长度oob = oob_squish参数可自动处理超出limits范围的数值,避免因数值溢出导致的填充异常
内容的提问来源于stack exchange,提问作者Almog Angel
相关产品推荐
相关产品推荐

