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

如何用R绘制不同量表的Likert图并实现多维度分面?

不同Likert量表的分组可视化解决方案

要实现你需要的效果,推荐使用ggplot2配合ggnewscale包(支持多填充图例),比likert包更灵活,能轻松实现不同量表的颜色区分、双图例,以及按国家分面的需求。以下是完整代码和说明:

步骤1:加载依赖包并准备数据

library(tidyverse)
library(ggnewscale)

# 生成样本数据(和你提供的一致,仅调整列名写法)
set.seed(1)
n <- 150
df1 <- data.frame(
  Country = factor(sample(1:2, n, replace=T), labels=c("US","Canada")), 
  Treatment = factor(sample(1:2, n, replace=T), labels=c("Base","Treatment")), 
  `1. An Agreement Question` = factor(sample(1:5,n, replace=T), labels=c("Strongly Disagree","Disagree","Neutral","Agree","Strongly Agree")),
  `2. A Frequency Question` = factor(sample(1:5,n, replace=T), labels=c("Very Unlikely","Unlikely","Neutral","Likely","Very Likely"))
)

# 将宽格式数据转为长格式,方便ggplot处理
df_long <- df1 %>%
  pivot_longer(
    cols = c(`1. An Agreement Question`, `2. A Frequency Question`),
    names_to = "Item", 
    values_to = "Response"
  )

步骤2:定义两个量表的专属颜色

为两个不同的Likert量表设置差异化的颜色,中性选项可以保持一致,其他选项用不同色系区分:

# 同意类问题的颜色映射
agreement_colors <- c(
  "Strongly Disagree" = "#c43e3e",
  "Disagree" = "#f29468",
  "Neutral" = "#f9e2ae",
  "Agree" = "#94c973",
  "Strongly Agree" = "#3e8f53"
)

# 可能性类问题的颜色映射
frequency_colors <- c(
  "Very Unlikely" = "#2d50b3",
  "Unlikely" = "#6386e3",
  "Neutral" = "#f9e2ae",
  "Likely" = "#f2b868",
  "Very Likely" = "#c4703e"
)

步骤3:绘制目标图表

ggplot() +
  # 绘制第一个问题(同意量表)的堆积条形图
  geom_bar(
    data = df_long %>% filter(Item == "1. An Agreement Question"),
    aes(x = Treatment, fill = Response),
    position = "fill" # 按比例展示,符合Likert图风格
  ) +
  scale_fill_manual(name = "Agreement Scale", values = agreement_colors) +
  
  # 启用新的填充比例尺,用于第二个问题
  new_scale_fill() +
  
  # 绘制第二个问题(可能性量表)的堆积条形图
  geom_bar(
    data = df_long %>% filter(Item == "2. A Frequency Question"),
    aes(x = Treatment, fill = Response),
    position = "fill"
  ) +
  scale_fill_manual(name = "Likelihood Scale", values = frequency_colors) +
  
  # 按国家分面,左右并列展示
  facet_wrap(~Country, nrow = 1) +
  
  # 调整图表样式
  labs(y = "Proportion", title = "Likert Responses by Country & Treatment") +
  coord_flip() + # 翻转坐标轴,符合传统Likert图的纵向布局
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5),
    strip.text = element_text(size = 12, face = "bold")
  )

效果说明

  • 左右两个子图分别对应美国和加拿大的数据,每个子图内按Base和Treatment分组展示两个问题的响应比例。
  • 两个问题使用完全独立的颜色方案和图例,不会混淆量表含义。
  • position="fill"确保每个条形的高度为100%,清晰展示各选项的占比。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 17:05:18