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

如何用ggplot同时可视化三个分类变量?需展示处理组差异

解决方案

要展示处理组(treatment)和对照组(control)的差异,核心是在数据统计和可视化环节把group变量纳入逻辑中,以下是修正后的代码:

修正后代码

library(tidyverse)
library(scales)

socio_egotropic_graph |> 
  drop_na() |> 
  filter(socio_egotropic != "N/A") |>  
  select(socio_egotropic, treatment_details, group) |> 
  # 按三个变量分组统计数量,确保每个组-时间-取向的计数正确
  group_by(group, treatment_details, socio_egotropic) |> 
  tally() |> 
  ungroup() |> 
  # 按组和处理前后计算各取向的占比
  group_by(group, treatment_details) |> 
  mutate(socio_egotropic_percentage = n / sum(n)) |> 
  mutate(across(c(socio_egotropic, treatment_details, group), as.factor)) |> 
  
  ggplot(aes(x = treatment_details, y = socio_egotropic_percentage, fill = socio_egotropic)) +
  geom_bar(stat = "identity", position = position_dodge(preserve = "single")) +
  # 按处理组/对照组分面展示,清晰对比两组差异
  facet_wrap(~group) +
  scale_y_continuous(labels = percent_format(accuracy = 1)) +
  labs(
    x = "处理阶段(前/后)",
    y = "观点取向占比",
    fill = "观点取向",
    title = "处理组与对照组的观点取向对比(处理前后)"
  ) +
  theme_bw() +
  theme(
    text = element_text(size = 10),
    plot.title = element_text(size = 10, face = "bold")
  )

关键改动说明

  • 数据统计环节:将group加入分组逻辑,先按group, treatment_details, socio_egotropic统计每个细分组的数量,再按group和treatment_details计算占比,确保占比是组内的相对比例,而非全局比例。
  • 可视化环节:使用facet_wrap(~group)将处理组和对照组的图表分开展示,直观对比两组在处理前后的取向变化;也可以选择将x设为interaction(treatment_details, group),把组和处理阶段合并为x轴类别,在同一图表中对比。

替代可视化方案

如果不想用分面,也可以把group作为x轴的分组维度,代码调整如下:

# 替代方案:同一图表中展示组和处理阶段的组合
ggplot(aes(x = interaction(treatment_details, group), y = socio_egotropic_percentage, fill = socio_egotropic)) +
  geom_bar(stat = "identity", position = position_dodge(preserve = "single")) +
  scale_y_continuous(labels = percent_format(accuracy = 1)) +
  scale_x_discrete(labels = c("处理前-对照组", "处理前-处理组", "处理后-对照组", "处理后-处理组")) +
  labs(
    x = "分组与处理阶段",
    y = "观点取向占比",
    fill = "观点取向",
    title = "处理组与对照组的观点取向对比"
  ) +
  theme_bw() +
  theme(
    text = element_text(size = 10),
    plot.title = element_text(size = 10, face = "bold"),
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:35:21