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

在R中用ggplot2结合李克特图与条形图并匹配水平轴

R中实现排序一致的李克特分面图与条形图

步骤1:准备模拟数据(可替换为你的真实数据)

先构造一个符合需求的测试数据集,方便后续验证:

set.seed(123) # 固定随机种子,确保结果可复现
df <- data.frame(
  var = LETTERS[1:20],
  val1 = sample(c("Very Dissatisfied", "Dissatisfied", "Neutral", "Satisfied", "Very Satisfied"), 20, replace = TRUE),
  val2 = sample(c("Very Dissatisfied", "Dissatisfied", "Neutral", "Satisfied", "Very Satisfied"), 20, replace = TRUE),
  val3 = sample(c("Very Dissatisfied", "Dissatisfied", "Neutral", "Satisfied", "Very Satisfied"), 20, replace = TRUE)
)

步骤2:处理数据,确定排序逻辑

先转换为长格式,再计算每个var的不满意项合计,筛选前10个最不满意的指标并固定顺序:

library(tidyverse)
library(ggstats) # 未安装的话先执行:install.packages("ggstats")

# 转换为长格式数据
df2 <- df %>%
  pivot_longer(cols = starts_with("val"), names_to = "item", values_to = "response")

# 计算每个var的不满意项合计,取前10并锁定顺序
top10_vars <- df2 %>%
  group_by(var) %>%
  summarise(dissat_total = sum(response %in% c("Very Dissatisfied", "Dissatisfied"))) %>%
  arrange(desc(dissat_total)) %>%
  slice_head(n = 10) %>%
  pull(var)

# 转为因子类型,固定排序(从最不满意到第10名)
ordered_vars <- factor(top10_vars, levels = top10_vars)

步骤3:绘制分面李克特图

可以用ggstats快速生成,也可以用ggplot2手动实现,两种方式都能保证顺序一致:

# 方法1:用ggstats一键生成李克特分面图
likert_plot(df2 %>% filter(var %in% top10_vars),
            x = var,
            response = response,
            facet = var,
            scales = "free_x") +
  scale_x_discrete(limits = top10_vars) +
  ggtitle("Top 10最不满意指标的李克特分布") +
  theme_minimal()

# 方法2:用ggplot2手动实现(无需依赖ggstats)
df2 %>%
  filter(var %in% top10_vars) %>%
  mutate(var = ordered_vars) %>%
  ggplot(aes(x = response, fill = response)) +
  geom_bar(position = "fill") +
  facet_wrap(~var, ncol = 2) + # 可根据需求调整分面列数
  coord_flip() + # 翻转坐标轴提升可读性
  scale_fill_brewer(palette = "RdYlGn") +
  scale_y_continuous(labels = scales::percent) +
  labs(y = "占比", x = "满意度", title = "Top 10最不满意指标的李克特分布") +
  theme_minimal()

步骤4:绘制匹配顺序的条形图

基于原始数据计算统计量,用之前锁定的ordered_vars保证水平轴顺序与李克特图完全一致:

# 计算原始数据中每个var的不满意项合计,绘制条形图
df %>%
  rowwise() %>%
  mutate(dissat_total = sum(c_across(starts_with("val")) %in% c("Very Dissatisfied", "Dissatisfied"))) %>%
  ungroup() %>%
  filter(var %in% top10_vars) %>%
  mutate(var = ordered_vars) %>%
  ggplot(aes(x = var, y = dissat_total)) +
  geom_bar(stat = "identity", fill = "#E63946") +
  labs(x = "指标", y = "不满意次数合计", title = "Top 10最不满意指标的不满意次数") +
  theme_minimal()

关键说明

两个图表的var排序都依赖ordered_vars这个因子,因此水平轴(或翻转后的纵轴)的顺序完全匹配,不会出现排序混乱的问题。

内容的提问来源于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.15 17:03:19