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

R语言:按组合维度排序Likert层级并匹配分组条形图

解决方案

以下是基于ggplot2和ggstats实现需求的完整代码,包含数据预处理、排序逻辑和图形对齐的细节:

1. 加载依赖包与生成模拟数据

library(ggplot2)
library(ggstats)
library(dplyr)
library(tidyr)
library(patchwork)

# 生成模拟Likert数据(固定随机种子保证可复现)
set.seed(123)
dat <- simulate_likert(
  n = 500,
  items = paste0("q", 1:6),
  grouping = sample(c("Group A", "Group B", "Group C"), 500, replace = TRUE, prob = c(0.4, 0.35, 0.25))
)

2. 实现分组排序(按计数降序)

先统计每个分组的样本量,以此为依据将grouping转换为有序因子:

# 获取分组的降序排序规则
group_order <- dat %>%
  count(grouping) %>%
  arrange(desc(n)) %>%
  pull(grouping)

# 将grouping转为有序因子
dat$grouping <- factor(dat$grouping, levels = group_order)

3. 实现分面内问题排序(按同意类占比降序)

计算每个分组下各问题的「Strongly agree+Agree」占比,据此为每个分组内的问题设定排序规则:

# 计算每个分组-问题组合的同意类占比,生成排序索引
item_order <- dat %>%
  pivot_longer(cols = starts_with("q"), names_to = "item", values_to = "response") %>%
  mutate(is_agree = response %in% c("Strongly agree", "Agree")) %>%
  group_by(grouping, item) %>%
  summarise(agree_pct = mean(is_agree), .groups = "drop") %>%
  arrange(grouping, desc(agree_pct)) %>%
  group_by(grouping) %>%
  mutate(item_rank = row_number()) %>%
  ungroup()

# 将问题转为带分组内排序的因子
dat_long <- dat %>%
  pivot_longer(cols = starts_with("q"), names_to = "item", values_to = "response") %>%
  left_join(item_order, by = c("grouping", "item")) %>%
  mutate(item = reorder_within(item, -item_rank, grouping))

4. 绘制Likert图与计数条形图并对齐

使用patchwork包实现两个图的水平对齐,通过宽度比例调整布局:

# 绘制分面Likert图
likert_plot <- gglikert(dat_long, item ~ response | grouping) +
  scale_x_reordered() + # 应用分组内的问题排序规则
  labs(x = NULL, y = NULL) +
  theme(strip.text = element_text(size = 12),
        panel.spacing = unit(1, "lines"))

# 绘制分组计数条形图(翻转坐标匹配Likert图的分组顺序)
count_plot <- dat %>%
  count(grouping) %>%
  ggplot(aes(x = grouping, y = n)) +
  geom_bar(stat = "identity", fill = "#2c3e50") +
  coord_flip() +
  labs(x = NULL, y = "样本量") +
  scale_x_discrete(limits = rev(group_order)) + # 反转顺序匹配Likert图的分面顺序
  theme_minimal() +
  theme(axis.text.y = element_text(size = 12))

# 水平拼接两个图,设置宽度比例
count_plot + likert_plot + plot_layout(widths = c(1, 3))

关键细节说明

  • reorder_within() + scale_x_reordered():实现了分面内独立排序,确保每个分组的问题都按自身同意类占比降序排列
  • 计数条形图使用rev(group_order)反转x轴顺序,保证和Likert图的分面行顺序完全匹配
  • patchwork的plot_layout()通过宽度比例控制两个图的占比,实现视觉上的对齐

内容的提问来源于stack exchange,提问作者Homer Jay Simpson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:34:57