如何在R中绘制带个体标签的Wright Map(项目-人员图)?
在R中制作带个体标签的项目-人员图(Wright Map)
方法1:基于wrightmap包替换人员直方图为标签
wrightmap包默认以直方图/密度图展示人员theta分布,但可以通过自定义绘图函数替换为个体标签:
- 先完成IRT模型拟合与参数提取:
library(mirt) library(wrightmap) # 拟合单维Rasch模型(根据你的数据调整模型类型) irt_model <- mirt(data = your_dataset, model = 1, itemtype = "Rasch") # 提取项目beta参数 item_betas <- sapply(coef(irt_model, IRTpars = TRUE)[-length(coef(irt_model, IRTpars = TRUE))], function(x) x[1]) # 提取人员theta估计值 person_thetas <- fscores(irt_model) # 准备人员标签(比如你的TD/RSK/SD分组) person_labels <- your_label_vector # 替换为你的实际标签向量
- 自定义人员绘图函数:
# 自定义函数:在对应theta位置绘制人员标签,加入随机抖动避免重叠 custom_person_plot <- function(theta, labels, ...) { y_jitter <- jitter(rep(0.5, length(theta)), amount = 0.3) text(theta, y_jitter, labels = labels, cex = 0.8, col = "#2c3e50") axis(side = 1, at = seq(-3, 3, 1)) }
- 调用
wrightmap生成带标签的图:
wrightmap(item_betas, person_thetas, person_plot = custom_person_plot, person_args = list(labels = person_labels), item_labels = names(item_betas)) # 显示项目标签
方法2:用ggplot2完全自定义(更灵活)
如果需要精细控制样式,用ggplot2手动拼接项目与人员模块:
- 整理绘图数据:
library(ggplot2) library(ggrepel) # 用于自动避免标签重叠 # 项目数据框 item_data <- data.frame( beta = item_betas, item_name = names(item_betas), y_pos = 1 # 项目模块的y轴基准位置 ) # 人员数据框 person_data <- data.frame( theta = as.vector(person_thetas), group_label = person_labels, y_pos = 0 # 人员模块的y轴基准位置 )
- 绘制Wright Map:
ggplot() + # 绘制项目点与标签 geom_point(data = item_data, aes(x = beta, y = y_pos), size = 3, color = "#e74c3c") + geom_text(data = item_data, aes(x = beta, y = y_pos + 0.1, label = item_name), size = 3) + # 绘制人员标签(用ggrepel自动避免重叠) geom_text_repel(data = person_data, aes(x = theta, y = y_pos, label = group_label), size = 2.5, color = "#2c3e50", direction = "y", box.padding = 0.2) + # 添加特质水平参考线 geom_vline(xintercept = seq(-3, 3, 1), linetype = "dashed", color = "gray80") + # 调整坐标轴与布局 scale_y_continuous(limits = c(-0.5, 1.5), breaks = c(0, 1), labels = c("人员", "项目")) + labs(x = "特质水平(Theta/Beta)", y = "") + theme_minimal() + theme(panel.grid = element_blank())
注意事项
- 标签重叠:如果标签过多,
ggrepel的geom_text_repel()比手动抖动更高效,还可以调整size、box.padding参数优化显示。 - 项目展示:如果需要保留WinSteps中项目的难度条样式,可添加
geom_segment绘制项目的阈值区间(根据IRT模型的阈值参数调整)。
内容的提问来源于stack exchange,提问作者act22
相关产品推荐
相关产品推荐

