如何为ggpaired的连线按计数加权,对比课前课后测试分数?
解决方案
要实现连接线条粗细与对应分数提升的学生人数成正比,核心是先对课前-课后分数配对进行人数统计,再将统计结果映射到线条的size参数上。以下是具体实现步骤:
1. 数据准备与预处理
先模拟符合你场景的数据集(可替换为你的真实数据),并统计每个分数配对的学生人数:
library(tidyverse) library(ggpubr) # 模拟40名学生的课前/课后分数(12分制) set.seed(123) df <- tibble( Before = sample(3:10, 40, replace = TRUE), After = Before + sample(0:4, 40, replace = TRUE) ) df$After <- pmin(df$After, 12) # 确保课后分数不超过12分 # 统计每个(Before, After)配对的学生人数 df_summary <- df %>% count(Before, After, name = "n_students")
2. 绘制带权重线条的配对图
手动构建类似ggpaired的可视化效果,直接控制线条粗细与学生人数的关联:
ggplot(df_summary, aes(group = interaction(Before, After))) + # 绘制课前分数点,大小对应人数 geom_count(aes(x = factor(1), y = Before, size = n_students), color = "#2E9FDF", alpha = 0.8) + # 绘制课后分数点,大小对应人数 geom_count(aes(x = factor(2), y = After, size = n_students), color = "#E7B800", alpha = 0.8) + # 绘制连接线条,粗细对应人数 geom_line(aes(x = factor(c(1,2)), y = c(Before, After), size = n_students), color = "gray50", alpha = 0.6) + # 配置坐标轴与标签 scale_x_discrete(labels = c("课前", "课后")) + scale_size_continuous(range = c(0.5, 3), name = "学生人数") + labs(x = "", y = "正确答题数(12分制)", title = "学生课前/课后分数提升对比") + theme_pubr()
关键说明
- 通过
count()函数统计每个分数配对的人数,得到权重变量n_students; - 将
n_students映射到geom_line的size参数,实现线条粗细随人数变化; - 调整
scale_size_continuous()的range参数,可控制线条和点的大小范围,避免视觉失衡; - 用
interaction(Before, After)作为分组变量,确保每个分数配对的线条独立连接。
内容的提问来源于stack exchange,提问作者Nick Murphy
相关产品推荐
相关产品推荐

