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

如何让两张ggplot热力图的log10转换scale_fill_gradient刻度一致?

问题描述

我在制作地图热力图时遇到了问题,希望两张热力图在进行log10转换的前提下,拥有完全一致的颜色刻度(即十六进制代码对应相同的填充值),但两个数据集的最大值不同。

以下是我单张热力图的代码,效果符合预期:

heatmap <- statebase +
  geom_sf(data=heatbycounties, color="NA", aes(fill=fy16map)) + 
  scale_fill_gradient(trans="log10", low = "#F1EFEF", high = "#F25430", na.value = "#F1EFEF") + 
  geom_sf(data = c_states, color="white", fill="NA") + #adding white state lines back on top
  theme(axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks = element_blank(),
        rect = element_blank(),
        plot.background = element_rect(fill="white"))

但如果直接用fy16map和fy22map两个数据集分别生成两张图,“high”颜色对应的数值不同,导致整个渐变刻度不一致。

我尝试过scale_fill_gradient和scale_fill_gradientn的多种参数组合,大多出现报错。曾生成过一个定义了颜色刻度的图,但没有log10转换时,大部分区域颜色过浅,几乎看不清,只有少数橙色区域。

作为R语言新手,我想询问:是否可以同时实现log10转换和指定渐变的最小值与最大值?


解决方案

当然可以同时实现log10转换和统一颜色刻度范围,核心是先确定两个数据集的全局极值(所有数据中的最小和最大值),然后在scale_fill_gradient中用limits参数固定刻度范围,同时保留trans="log10"转换。

具体步骤

  1. 先提取两个数据集填充变量的全局最小和最大值:
# 假设fy16map来自heatbycounties,fy22map来自heatbycounties_fy22
global_min <- min(heatbycounties$fy16map, heatbycounties_fy22$fy22map, na.rm = TRUE)
global_max <- max(heatbycounties$fy16map, heatbycounties_fy22$fy22map, na.rm = TRUE)

# 如果全局最小值接近0,log10会报错,可添加极小偏移
# global_min <- max(global_min, 0.1)
  1. 生成两张图时,使用完全一致的scale_fill_gradient配置:

FY16热力图

heatmap_16 <- statebase +
  geom_sf(data=heatbycounties, color="NA", aes(fill=fy16map)) + 
  scale_fill_gradient(trans="log10", 
                      low = "#F1EFEF", 
                      high = "#F25430", 
                      na.value = "#F1EFEF",
                      limits = c(global_min, global_max)) + 
  geom_sf(data = c_states, color="white", fill="NA") +
  theme(axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks = element_blank(),
        rect = element_blank(),
        plot.background = element_rect(fill="white"))

FY22热力图

heatmap_22 <- statebase +
  geom_sf(data=heatbycounties_fy22, color="NA", aes(fill=fy22map)) + 
  scale_fill_gradient(trans="log10", 
                      low = "#F1EFEF", 
                      high = "#F25430", 
                      na.value = "#F1EFEF",
                      limits = c(global_min, global_max)) + 
  geom_sf(data = c_states, color="white", fill="NA") +
  theme(axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks = element_blank(),
        rect = element_blank(),
        plot.background = element_rect(fill="white"))

关键说明

  • limits参数强制颜色刻度的范围统一为全局极值,确保相同的填充值在两张图中对应完全一致的颜色。
  • trans="log10"保留对数转换,解决无转换时大部分区域颜色过浅的问题。
  • 如果全局最小值为0,log10运算会报错,可给最小值设置一个极小的阈值(比如0.1),避免计算错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:46:19