如何使用ggplot2重绘展示占比的crosstab交叉表图?
R实现占比型交叉表方块图方案
- 绘制目标:重绘用于展示占比的crosstab plot(交叉表图),核心形式为行列分类交叉的网格中,用不同大小的实心方块对应单元格的数值/占比大小。
- 初始尝试问题:最初的测试代码直接在
geom_point()参数中传入全局数值向量设置点大小,没有遵循ggplot的映射规则,同时缺少尺寸缩放校准、样式适配,无法达到目标效果。
初始测试代码如下:
library(ggplot2) df <- data.frame (col = c("A","A","B","B"), row = c("C", "D","C","D"), val = c(4,10,29,31)) ggplot(df, aes(y = row, x = col)) + geom_point(size = df$val, shape = 15)
实现思路
- 图层选型:初始方向判断正确,使用
geom_point()搭配实心方块形状参数shape = 15即可实现核心效果,无需自定义复杂图层。 - 映射规则修正:将单元格数值
val放入aes()内部的size映射通道,不要直接在图层参数中传入全局数据向量,保证ggplot的映射逻辑正常生效。 - 尺寸感知校准:使用
scale_size_area()调整方块尺寸缩放规则,保证方块面积和数值大小成正比,避免半径缩放带来的视觉感知偏差,这是这类占比可视化的核心细节。 - 样式适配:搭配极简主题、浅灰色网格线,可按需添加方块白边、单元格数值标注,匹配专业可视化的排版风格。
可运行参考代码
library(ggplot2) df <- data.frame (col = c("A","A","B","B"), row = c("C", "D","C","D"), val = c(4,10,29,31)) ggplot(df, aes(x = col, y = row)) + # 核心方块图层,size映射到数值,设置方块填充色 geom_point(aes(size = val), shape = 15, color = "#2c7fb8") + # 按面积缩放方块,设置最大方块尺寸,可按需选择是否隐藏尺寸图例 scale_size_area(max_size = 28, guide = "none") + # 可选:添加单元格数值标注 geom_text(aes(label = val), color = "white", size = 5) + # 主题排版调整 theme_minimal() + theme( panel.grid = element_line(color = "grey92", linewidth = 0.5), axis.text = element_text(size = 11, color = "black"), axis.title = element_blank() )
提示:如果使用占比类数据,可先将数值归一化到0-100区间,再微调
scale_size_area()的max_size参数,即可匹配目标展示效果。如果需要按分类区分方块颜色,只需在aes()中增加color = 分类字段的映射即可。
内容的提问来源于stack exchange,提问作者marho
相关产品推荐
相关产品推荐

