如何绘制(No/Sometimes/Yes)量规结果以对比学生教学前后表现
问题概述
现有一份记录学生教学前(Pre_instruction)、教学后(Post_instructions)表现的数据集,包含Clarity、Loudness、Details等多维度的等级评分(No/Sometimes/Yes)。需要绘制各维度单独的教学前后表现对比图,但现有代码将所有维度变量合并,无法实现分维度对比,需修正代码。
数据结构
数据集结构如下:
structure(list(Phase = c("Pre_instruction", "Pre_instruction", "Pre_instruction", "Pre_instruction", "Pre_instruction", "Pre_instruction", "Pre_instruction", "Pre_instruction", "Pre_instruction", "Pre_instruction" ), Group = c("G1", "G1", "G1", "G1", "G1", "G1", "G1", "G1", "G1", "G1"), Speaker = c("S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9", "S10"), Clarity = c("Sometimes", "Sometimes", "Sometimes", "Sometimes", "No", "Yes", "Yes", "Sometimes", "No", "Yes"), Loudness = c("Yes", "No", "Sometimes", "No", "No", "Yes", "Yes", "No", "No", "Yes"), Details = c("sometimes ", "Sometimes ", "Sometimes ", "No", "No", "Yes", "sometimes ", "No", "No", "Yes" ), Eye_Contact = c("Sometimes", "No", "No", "No", "Sometimes", "Sometimes", "No", "No", "No", "Sometimes"), Interaction = c("Sometimes", "Sometimes ", "Yes", "No", "Sometimes ", "Sometimes", "Sometimes", "Sometimes", "Sometimes", "Yes")), row.names = c(NA, 10L), class = "data.frame")
原错误代码
用户尝试的代码存在数据整理逻辑错误,导致维度合并:
knitr::opts_chunk$set(echo = TRUE) library(tidyverse) library(dplyr) library(knitr) library(ggplot2) mydata <- read.csv("./R1_stat.csv") # mydata %>% gather(Phase, Clarity) %>% mutate(Clarity = factor(Clarity, levels = c("No", "Sometimes", "Yes"))) %>% mutate(Phase = factor(Phase, levels = c("Pre_instruction", "Post_instructions"))) %>% count(Phase, Clarity) %>% complete(Phase, Clarity, fill = list(n = 0)) %>% group_by(Phase) %>% mutate(Percentage = n / sum(n) * 100) %>% ggplot(aes(x= Clarity, Percentage, fill= Phase))+ geom_histogram(stat='identity') ggsave("2.png")
正确实现方法
核心修正点
原代码误用gather,错误地将Phase列和维度变量混在一起。正确做法是将所有维度变量(Clarity、Loudness等)转换为长格式的"维度-评分"对,保留Phase列用于分组对比。
完整代码
knitr::opts_chunk$set(echo = TRUE) library(tidyverse) library(ggplot2) # 读取数据 mydata <- read.csv("./R1_stat.csv") # 数据整理与可视化 mydata %>% # 将多维度变量转换为长格式:Dimension(维度名称)、Rating(评分) pivot_longer(cols = c(Clarity, Loudness, Details, Eye_Contact, Interaction), names_to = "Dimension", values_to = "Rating") %>% # 统一Rating格式:去除空格、转换为一致大小写 mutate(Rating = str_trim(str_to_title(Rating))) %>% # 因子化评分和阶段,保证顺序正确 mutate(Rating = factor(Rating, levels = c("No", "Sometimes", "Yes")), Phase = factor(Phase, levels = c("Pre_instruction", "Post_instructions"))) %>% # 按阶段、维度、评分分组计数 count(Phase, Dimension, Rating) %>% # 补全缺失的组合(避免某个评分在某阶段无数据时不显示) complete(Phase, Dimension, Rating, fill = list(n = 0)) %>% # 计算每个维度在各阶段内的百分比 group_by(Phase, Dimension) %>% mutate(Percentage = n / sum(n) * 100) %>% ungroup() %>% # 绘制分面柱状图 ggplot(aes(x = Rating, y = Percentage, fill = Phase)) + geom_col(position = position_dodge(width = 0.8), width = 0.7) + # 分组柱状图 facet_wrap(~ Dimension, scales = "free_y") + # 每个维度单独一个子图 labs(title = "各维度教学前后表现对比", x = "评分等级", y = "占比(%)", fill = "教学阶段") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 保存图片 ggsave("dimension_comparison.png", width = 12, height = 8)
代码说明
pivot_longer:将宽格式的多维度列转换为长格式,生成Dimension(维度名称)和Rating(对应评分)两列,保留Phase列用于区分教学阶段。- 格式统一:用
str_trim和str_to_title处理评分中的空格和大小写不一致问题(如原数据中"sometimes "和"Sometimes ")。 - 百分比计算:按
Phase和Dimension分组计算百分比,确保每个维度内的占比独立计算,而非所有维度合并计算。 - 分面绘图:用
facet_wrap(~ Dimension)实现每个维度单独展示,position_dodge设置分组柱状图,清晰对比同一维度在Pre/Post阶段的评分分布。
内容的提问来源于stack exchange,提问作者lureen naser
相关产品推荐
相关产品推荐

