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

如何在waffle图图例中显示数值小于1的分组

在waffle图中保留所有分组的图例(包括数值小于1或0的分组)

问题描述

使用hrbrmstr/waffle包绘制华夫图时,数值小于1%甚至为0的分组(如示例中的Group5、Group6)无法在图例中显示。尝试手动指定颜色、使用ggplot2::scale_fill_manual、改用向量输入等方法均未解决,且不想通过ceiling()修改数据(会导致总和超过100%并歪曲小比例数据)。

解决方法

核心问题在于waffle()函数会自动过滤掉无对应方块的分组(数值换算后为0的类别),因此需要手动保留所有分组的因子水平,并通过ggplot的scale设置强制显示所有图例项。

步骤与代码示例

  1. 加载所需包
# 若未安装先执行安装
# remotes::install_github("hrbrmstr/waffle")
library(waffle)
library(ggplot2)
library(RColorBrewer)
  1. 定义原始数据
df <- structure(list(Category = c(
  "Group1", "Group2", "Group3", 
  "Group4", "Group5", "Group6"), 
  Percentage = c(50.31, 39.95, 
                 6.21, 3.10, 0.41, 0)), 
  row.names = c(NA, -6L), class = "data.frame")
  1. 处理分组因子并生成可显示全图例的华夫图
# 将Category转换为因子,锁定所有原始分组水平
df$Category <- factor(df$Category, levels = df$Category)

# 生成基础华夫图
p <- waffle(df)

# 修正图中数据的因子水平,确保包含所有原始分组
p$data$Category <- factor(p$data$Category, levels = df$Category)

# 添加手动填充色并强制保留所有图例项
p + scale_fill_manual(
  values = brewer.pal(nrow(df), "Set2"),
  drop = FALSE
)

关键说明

  • 通过将Category转换为包含所有原始水平的因子,避免ggplot自动丢弃无方块的分组。
  • drop = FALSE参数强制scale显示所有因子水平,即使对应数据中没有实际的方块。
  • 该方法不修改原始百分比数据,仅调整图例显示逻辑,避免了ceiling()带来的数据歪曲问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:27:33