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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:57:21