R ggplot2中如何实现阈值下点固定色、阈值上点色平滑渐变
ggplot2 自定义阈值分段色阶实现方案
要实现「weights < 1的点固定为深蓝色、weights >= 1的点按权重从浅蓝到更浅蓝平滑渐变」的效果,不需要拆分数据集,直接通过scale_color_gradientn()自定义色阶截断规则即可,具体实现如下:
- 核心原理:把权重=1设为颜色分界点,小于等于1的区间全部映射为同一种深蓝色,大于1的区间配置连续的浅蓝渐变色带,通过
values参数控制色阶映射的位置,保证分界点精准 - 顺带修正原代码的小问题:原代码把固定点大小
size=3写在了aes()内部,会被识别为映射变量生成无意义的图例,把该参数移到geom_point()内部作为固定属性即可
可直接运行的修改后代码
p_cd = c(0.01,0.15,0.5,0.7,0.9) p_cr = c(0.01,0.15,0.5,0.7,0.9) data = as.data.frame(expand.grid(p_cd,p_cr)) data = cbind(data,rep(NA,dim(data)[1])) colnames(data) = c('p_cd','p_cr','weights') weights = runif(sum(seq(1,4,by=1)),0,5) u = 1 for(i in 1:dim(data)[1]){ if(data[i,1]>data[i,2]){ data[i,3] = weights[u] u = u + 1 } } library(ggplot2) ggplot(data[!is.na(data[,3]),], aes(x=p_cd, y=p_cr, color=weights)) + geom_point(size = 3) + scale_color_gradientn( name = "weights", # 图例显示的断点值 breaks = c(0, 1, round(max(data$weights, na.rm = T), 1)), # 对应色值:前两个统一为深蓝色,后两个为浅蓝到极浅蓝的渐变 colors = c("#08306b", "#08306b", "#6baed6", "#f7fbff"), # 映射规则:<1的区间全部对应深蓝色,1到最大值区间走连续渐变 values = scales::rescale(c( min(data$weights, na.rm = T), 1, 1, max(data$weights, na.rm = T) )) )
参数调整说明
- 如果需要修改蓝色的深浅,直接替换
colors参数里的十六进制色值即可:前两个保持一致就是weights <1的固定色,第三个色值对应权重=1时的起始浅蓝色,第四个色值对应权重取最大值时的最浅蓝 - 如果需要调整分界阈值,把代码里所有
1替换成你需要的阈值数值即可,逻辑完全通用
内容的提问来源于stack exchange,提问作者Jonathan1234
相关产品推荐
相关产品推荐

