如何为calendR日历图动态调整AQI图例顺序?
解决calendR包AQI日历图图例指定顺序并适配不同社区类别问题
核心思路
先定义固定的AQI类别优先级顺序和对应颜色映射,针对每个社区的数据集,动态提取该社区存在的AQI类别,再通过scale_fill_manual()的limits参数强制图例按指定顺序排列,同时仅传入当前社区存在的类别对应的颜色,避免因类别数量不匹配报错。
步骤实现
1. 准备环境与示例数据
# 加载所需包 library(calendR) library(dplyr) # 模拟两个社区的AQI数据 set.seed(123) aqi_data <- data.frame( date = seq(as.Date("2023-01-01"), as.Date("2023-12-31"), by = "day"), community = rep(c("community 1", "community 2"), each = 182), aqi_category = c( sample(c("Good", "Moderate", "Unhealthy for sensitive groups", "Unhealthy", "Very unhealthy", "Hazardous"), 182, replace = TRUE), sample(c("Good", "Moderate", "Unhealthy for sensitive groups"), 182, replace = TRUE) # community 2仅包含3个类别 ) )
2. 定义全局AQI顺序与颜色映射
按照健康风险严重程度预先设定好顺序和对应颜色:
# 全局AQI类别优先级顺序(按需求指定) aqi_order <- c( "Good", "Moderate", "Unhealthy for sensitive groups", "Unhealthy", "Very unhealthy", "Hazardous" ) # 对应颜色映射(可根据需求调整) aqi_colors <- c( "Good" = "#00e400", "Moderate" = "#ffff00", "Unhealthy for sensitive groups" = "#ff7e00", "Unhealthy" = "#ff0000", "Very unhealthy" = "#99004c", "Hazardous" = "#7e0023" )
3. 动态适配的日历图生成函数
编写函数处理单个社区的数据,自动适配类别数量并保持图例顺序:
generate_aqi_calendar <- function(community_data, community_name) { # 提取当前社区存在的AQI类别 present_categories <- unique(community_data$aqi_category) # 生成日历图 calendR( year = 2023, data = community_data$aqi_category, date = community_data$date, fill = "data", title = paste("AQI Calendar -", community_name), legend_pos = "right" ) + scale_fill_manual( # 强制图例按全局指定顺序排列 limits = aqi_order, # 仅传入当前社区存在的类别对应的颜色 values = aqi_colors[present_categories], # 仅显示当前社区存在的类别(可选:若需显示全类别,可移除该参数并添加na.value="#cccccc") breaks = present_categories, name = "AQI Category" ) } # 测试全类别社区 generate_aqi_calendar(filter(aqi_data, community == "community 1"), "community 1") # 测试类别不全的社区 generate_aqi_calendar(filter(aqi_data, community == "community 2"), "community 2")
关键说明
limits = aqi_order:强制图例的显示顺序遵循预先定义的健康风险优先级,完全不受数据中类别出现顺序或字母排序影响。values = aqi_colors[present_categories]:仅传入当前社区实际存在的类别对应的颜色,从根源解决了类别数量不匹配导致的报错问题。- 若需要在图例中显示全部6个AQI类别(不存在的类别置灰),可移除
breaks参数,将values设为aqi_colors,并添加na.value = "#cccccc"。
内容的提问来源于stack exchange,提问作者Kelly Ireland
相关产品推荐
相关产品推荐

