如何用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
相关产品推荐
相关产品推荐

