如何在waffle图图例中显示数值小于1的分组
在waffle图中保留所有分组的图例(包括数值小于1或0的分组)
问题描述
使用hrbrmstr/waffle包绘制华夫图时,数值小于1%甚至为0的分组(如示例中的Group5、Group6)无法在图例中显示。尝试手动指定颜色、使用ggplot2::scale_fill_manual、改用向量输入等方法均未解决,且不想通过ceiling()修改数据(会导致总和超过100%并歪曲小比例数据)。
解决方法
核心问题在于waffle()函数会自动过滤掉无对应方块的分组(数值换算后为0的类别),因此需要手动保留所有分组的因子水平,并通过ggplot的scale设置强制显示所有图例项。
步骤与代码示例
- 加载所需包
# 若未安装先执行安装 # remotes::install_github("hrbrmstr/waffle") library(waffle) library(ggplot2) library(RColorBrewer)
- 定义原始数据
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")
- 处理分组因子并生成可显示全图例的华夫图
# 将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
相关产品推荐
相关产品推荐

