如何绘制保留原始顺序的二元有序数据华夫图(Waffle chart)
保留原始序列顺序的双色华夫图实现方案
完全可以实现需求,不需要依赖waffle包的默认聚合排布逻辑。
现有waffle包默认方法无法保留顺序的核心原因是其会先对不同类别的值做计数聚合,再按计数结果排布色块,并非逐元素映射原始序列位置,因此无法满足顺序保留需求。我们只需要手动为向量中的每个元素分配行列坐标,再通过ggplot2绘制方块即可,完美适配20宽10高的示例规格,也可直接扩展到长度3000的向量场景,同时直观呈现1的分布位置与连续游程特征。
实现逻辑
- 不对原始向量做类别聚合,严格按照元素的原始索引分配排布位置:按指定宽度逐行排列,前w个元素放在第一行,接下来w个元素放在第二行,直到所有元素排布完成
- 坐标映射规则:对第i个元素,x轴坐标为
(i-1) %% w + 1(w为设定的图宽度),y轴坐标为H - (i-1) %/% w(H为图总高度,即向量长度/宽度,y轴倒序是为了让第一个元素出现在图的左上角,符合从左到右、从上到下的常规阅读顺序) - 用两种对比明显的颜色区分0、1值,添加白色细边框模拟华夫图的格子间隙效果
可直接运行的代码
library(tidyverse) # 示例数据,可替换为你长度为3000的自有向量 set.seed(123) # 固定随机种子方便结果复现 dabble <- ifelse(runif(200) < 0.8, 0, 1 ) # 设定华夫图规格 plot_width <- 20 # 示例宽度为20,3000长度向量可设为50,对应高度60,可按需调整 plot_height <- length(dabble) %/% plot_width # 示例对应高度为10 # 为每个元素匹配坐标 plot_data <- tibble( value = factor(dabble, levels = c(0,1)), idx = 1:length(dabble) ) %>% mutate( x = (idx - 1) %% plot_width + 1, y = plot_height - (idx - 1) %/% plot_width ) # 绘制华夫图 ggplot(plot_data, aes(x = x, y = y, fill = value)) + geom_tile(color = "white", linewidth = 0.5) + # 白色边框模拟格子间隙 scale_fill_manual(values = c("0" = "#F0F0F0", "1" = "#D62828"), # 0设为浅灰色,1设为醒目的砖红色,可自定义颜色 labels = c("0" = "零值", "1" = "值为1的元素")) + scale_x_continuous(breaks = 1:plot_width, expand = c(0,0)) + scale_y_continuous(breaks = 1:plot_height, expand = c(0,0)) + coord_fixed() + # 强制方块为正方形 theme_minimal() + theme( axis.title = element_blank(), panel.grid = element_blank(), legend.position = "bottom" )
效果说明
- 100%保留原始向量排列顺序:图中左上角第一个格子对应向量第1个元素,从左到右、从上到下严格匹配向量原始序列,零散分布的1、连续相邻的1形成的游程都可以直观识别
- 适配任意长度的0-1向量:只需要修改
plot_width参数即可调整排布密度,不会出现顺序错乱、元素遗漏的问题 - 可扩展游程统计标注:如果需要进一步量化连续游程特征,可以先用
rle()函数计算每个连续1段的长度,给不同长度的游程分配梯度颜色,直接在图上高亮长游程位置
内容的提问来源于stack exchange,提问作者123blee
相关产品推荐
相关产品推荐

