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
相关产品推荐
相关产品推荐

