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

ggplot2 geom_tile如何设置超出渐变条限值的填充颜色

ggplot2的连续颜色标度中,超出limits设定范围的数值会被默认识别为NA,统一填充为灰色。要分别自定义低于下限、高于上限的填充色,可参考以下两种可行方案:

方案1:新增叠加图层实现

逻辑简单直观,无需修改原始数据的映射关系,适合快速出图:

library(tidyverse)
library(RColorBrewer)
tile_data <- data.frame(category=letters[1:5],
                        region=paste0('region_',1:5),
                        sales=c(1,2,5,0.1,300))

tile_data %>% ggplot(aes(x=category,
                         y=region,
                         fill=sales))+
  geom_tile()+
  scale_fill_gradientn(limits=c(1,11),
                       colors=brewer.pal(12,'Spectral'),
                       na.value = "transparent") + # 将默认超限的灰色改为透明
  # 单独渲染低于下限的瓦片
  geom_tile(data = ~filter(.x, sales < 1), fill = "darkblue") +
  # 单独渲染高于上限的瓦片
  geom_tile(data = ~filter(.x, sales > 11), fill = "black") +
  theme_minimal()

方案2:重编码填充值适配色阶

仅用一个geom_tile层即可实现,图例可和原有渐变无缝衔接,适合正式出图场景:

library(tidyverse)
library(RColorBrewer)
tile_data <- data.frame(category=letters[1:5],
                        region=paste0('region_',1:5),
                        sales=c(1,2,5,0.1,300))

tile_data %>%
  # 对填充值做重编码,给超限值单独分配区间端点
  mutate(fill_val = case_when(
    sales < 1 ~ 0,
    sales > 11 ~ 12,
    TRUE ~ sales
  )) %>%
  ggplot(aes(x=category,
             y=region,
             fill=fill_val))+
  geom_tile()+
  scale_fill_gradientn(limits=c(0,12),
                       # 配置颜色映射的位置关系
                       values = scales::rescale(c(0,1,11,12)),
                       # 按位置匹配对应颜色:0对应darkblue,1-11对应光谱渐变,12对应black
                       colors = c("darkblue", brewer.pal(12,'Spectral'), "black"),
                       # 图例仅显示1-11的原区间数值,隐藏超限的端点值
                       breaks = seq(1,11,2)) +
  labs(fill = "sales") +
  theme_minimal()

两种方案均可实现需求,可根据自身使用场景选择。

内容的提问来源于stack exchange,提问作者anderwyang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:15:10