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

如何绘制(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)

代码说明

  1. pivot_longer:将宽格式的多维度列转换为长格式,生成Dimension(维度名称)和Rating(对应评分)两列,保留Phase列用于区分教学阶段。
  2. 格式统一:用str_trim和str_to_title处理评分中的空格和大小写不一致问题(如原数据中"sometimes "和"Sometimes ")。
  3. 百分比计算:按Phase和Dimension分组计算百分比,确保每个维度内的占比独立计算,而非所有维度合并计算。
  4. 分面绘图:用facet_wrap(~ Dimension)实现每个维度单独展示,position_dodge设置分组柱状图,清晰对比同一维度在Pre/Post阶段的评分分布。

内容的提问来源于stack exchange,提问作者lureen naser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:33:20