如何在R中标准化热力图的颜色填充值范围
解决统一颜色刻度的方法
核心问题是你每次只筛选单一年份的数据绘图,scale_fill_viridis_c默认会根据当前子集的IR值范围生成颜色映射,导致各年份刻度不统一。要实现标准化刻度,关键是基于整个数据集的IR极值固定颜色范围,具体操作如下:
步骤1:预先计算全局的IR极值
先从完整数据集中获取所有年份IR的最小值和最大值,作为统一的刻度范围:
# 计算全局IR的最小/最大值(忽略NA值) global_ir_range <- range(joined_shapefile_postcode$IR, na.rm = TRUE)
步骤2:修改绘图代码,固定颜色范围
在scale_fill_viridis_c中添加limits参数传入全局范围,同时保留breaks参数控制刻度显示——注意breaks只是定义刻度位置,limits才是真正约束颜色映射的取值范围:
# 绘制2019年地图(刻度统一) map_lphu_aus <- joined_shapefile_postcode %>% dplyr::filter(EVENT_YEAR == 2019) %>% ggplot() + geom_sf(aes(fill = IR, geometry = geometry)) + scale_fill_viridis_c(option = "plasma", limits = global_ir_range, breaks = breaks) + labs(fill = "Incidence Rate per 100,000", title = "2019", subtitle = "Hepatitis C -Unspecified") + theme_minimal() + theme(axis.text.x = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank(), panel.grid = element_blank()) map_lphu_aus
进阶:批量生成所有年份的地图
如果要快速生成20年的所有地图,可以封装成函数避免重复代码:
# 定义通用绘图函数 plot_year_map <- function(target_year) { joined_shapefile_postcode %>% dplyr::filter(EVENT_YEAR == target_year) %>% ggplot() + geom_sf(aes(fill = IR, geometry = geometry)) + scale_fill_viridis_c(option = "plasma", limits = global_ir_range, breaks = breaks) + labs(fill = "Incidence Rate per 100,000", title = as.character(target_year), subtitle = "Hepatitis C -Unspecified") + theme_minimal() + theme(axis.text.x = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank(), panel.grid = element_blank()) } # 调用函数生成对应年份地图 plot_year_map(2010) plot_year_map(2019)
这样所有年份的地图都会使用相同的颜色刻度范围,不同年份的发病率变化对比会更直观准确。
内容的提问来源于stack exchange,提问作者Kwalker
相关产品推荐
相关产品推荐

