You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:58:01