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

R语言ggplot绘制Waffle图表时0值导致图例无法合并的解决方法

解决Waffle包含0值数据时图例无法合并的问题

核心原因

当数据包含0值时,ggplot会自动过滤无数据的类别,但scale_label_pictogram与scale_color_manual的映射若未同步保留所有类别,就会导致图例无法合并。

解决方案步骤

  • 先将类别列转换为包含所有水平的因子,确保0值对应的类别不会被自动丢弃:
    df_1$category <- factor(df_1$category, levels = c("类别1", "类别2", "类别3")) # 替换为你的实际类别列表
    
  • 在两个scale中都设置drop = FALSE,强制保留所有类别映射:
    scale_label_pictogram(
      name = NULL, # 统一图例名称,避免重复
      values = c("类别1" = "icon1", "类别2" = "icon2", "类别3" = "icon3"),
      drop = FALSE
    ) +
    scale_color_manual(
      name = NULL,
      values = c("类别1" = "#ff0000", "类别2" = "#00ff00", "类别3" = "#0000ff"),
      drop = FALSE
    )
    
  • 若图标与颜色未自动对齐,用guides()统一图例样式:
    guides(
      label = guide_legend(order = 1),
      color = guide_legend(order = 1)
    )
    

完整示例代码

library(tidyverse)
library(waffle)

# 构造含0值的示例数据
df_1 <- tibble(
  category = c("A", "B", "C"),
  value = c(5, 0, 3)
)

# 转换为因子并锁定所有类别水平
df_1$category <- factor(df_1$category, levels = c("A", "B", "C"))

# 绘制waffle图并合并图例
ggplot(df_1, aes(fill = category, values = value)) +
  geom_waffle(n_rows = 3, color = "white", size = 1.25) +
  scale_label_pictogram(
    name = NULL,
    values = c("A" = "car", "B" = "bike", "C" = "bus"),
    drop = FALSE
  ) +
  scale_fill_manual(
    name = NULL,
    values = c("A" = "#2c3e50", "B" = "#e74c3c", "C" = "#3498db"),
    drop = FALSE
  ) +
  guides(
    fill = guide_legend(override.aes = list(label = c("car", "bike", "bus")))
  ) +
  theme_void()

关键说明

  • drop = FALSE是核心,确保所有类别无论有无数据都保留在图例中
  • 统一两个scale的name参数(如都设为NULL),让ggplot识别它们属于同一图例
  • 若图标与颜色错位,可通过guides()的override.aes手动指定每个类别的图标,强制合并

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:10:36