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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:42:03