如何使用R为调查分类数据绘制分组条形图?
分组条形图实现方案
第一步:修正原有代码笔误
你的现有代码存在两处笔误,先修正后再计算百分比:如果你的Q1变量的缺失值标记确实存储在data$Q11列中,可保留原Q1[data$Q11 == -99] <- NA的写法。
# 处理Q1数据 Q1[data$Q1 == -99] <- NA Q1s <- factor(Q1, labels = c("Strongly Disagree", "Disagree", "Neither Agree nor Disagree", "Agree", "Strongly Agree")) Q1_PERCENTAGE <- prop.table(table(Q1s)) * 100 # 处理Q2数据 Q2[data$Q2 == -99] <- NA Q2s <- factor(Q2, labels = c("Strongly Disagree", "Disagree", "Neither Agree nor Disagree", "Agree", "Strongly Agree")) Q2_PERCENTAGE <- prop.table(table(Q2s)) * 100
第二步:基础绘图包实现分组条形图
barplot函数的beside参数设为TRUE即可生成并排的分组条形图,需要先把两个问题的百分比合并为矩阵:
# 按行合并两个问题的百分比,行对应问题,列对应李克特选项 percent_matrix <- rbind(Q1_PERCENTAGE, Q2_PERCENTAGE) # 转置矩阵,让每个分组对应不同态度选项 percent_matrix <- t(percent_matrix) # 绘制分组条形图 barplot(percent_matrix, beside = TRUE, # 核心参数:TRUE为分组条形图,FALSE为堆叠条形图 col = c("#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FFEAA7"), # 自定义选项配色 legend.text = rownames(percent_matrix), args.legend = list(x = "top", bty = "n"), ylab = "占比(%)", xlab = "问题", main = "不同问题的态度分布对比")
可选:ggplot2实现分组条形图
如果需要更灵活的样式调整,可以用ggplot2绘制:
library(ggplot2) library(tidyr) # 把矩阵转为ggplot2要求的长格式数据框 df <- as.data.frame(percent_matrix) df$option <- rownames(df) df_long <- pivot_longer(df, cols = c("Q1_PERCENTAGE", "Q2_PERCENTAGE"), names_to = "question", values_to = "percentage") # 绘图 ggplot(df_long, aes(x = question, y = percentage, fill = option)) + geom_col(position = position_dodge(0.9), width = 0.8) + scale_fill_brewer(palette = "Set2", name = "态度选项") + labs(x = "问题", y = "占比(%)", title = "不同问题的态度分布对比") + scale_x_discrete(labels = c("Q1_PERCENTAGE" = "问题1", "Q2_PERCENTAGE" = "问题2")) + theme_minimal() + theme(legend.position = "top")
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

