ggplot2多图绘制、数据预处理优化及绘图样式调整问题
更简洁的数据预处理方案
你可以使用tidyr的长表转换功能一次性完成所有P3组问题的统计,无需手动拼接多个临时表,代码如下:
# 加载依赖包 library(tidyverse) # 读取原始数据 dane <- read.csv2("ankieta.csv", header = TRUE, sep = ";") # 一站式转换得到目标结构数据 df_merge <- dane %>% # 筛选需要处理的P3组问题列 + 学历列 select(starts_with("P_3"), Wyksztalcenie) %>% # 宽表转长表,将问题列名提取为「Pytanie」列,回答值提取为「Lp」列 pivot_longer(cols = -Wyksztalcenie, names_to = "Pytanie", values_to = "Lp") %>% # 按学历、问题、回答值分组计数,结果列命名为「Liczebność」 count(Wyksztalcenie, Pytanie, Lp, name = "Liczebność") %>% # 重命名学历列和原有格式统一 rename(Wykształcenie = Wyksztalcenie)
三个绘图问题的解决方案
在绘图前先对学历列做因子化处理,解决分面排序问题:
df_merge <- df_merge %>% mutate(Wykształcenie = factor(Wykształcenie, # 按你需要的顺序指定因子层级 levels = c("podstawowe", "zawodowe", "srednie", "wyzsze")))
优化后的绘图代码如下:
ggplot(data = df_merge, aes(x = factor(Lp), y = Liczebność, fill = Pytanie)) + # position = "dodge" 让不同问题的条形并列展示,避免堆叠 geom_col(position = "dodge") + # 分面设置为2列布局 facet_wrap(~ Wykształcenie, ncol = 2) + labs(x = "回答选项", y = "数量", title = "P3组问题的回答分布,按学历分组:") + # 可选:自定义填充配色,也可以删掉这行用默认配色 scale_fill_brewer(palette = "Set2")
问题原理解释
- 调整分面顺序:R中分类变量默认按字母顺序排序,将
Wykształcenie转为手动指定层级的因子后,分面会自动按你指定的顺序排列。 - 分面设为2列:原来使用的
facet_grid是固定行列的网格布局,替换为facet_wrap并指定ncol = 2即可实现2列分面。 - 条形填充色设置:你之前的代码仅设置了
color = Pytanie,color仅控制条形的边框颜色,填充色需要映射到fill参数,修改后即可自动生成彩色填充的条形。
内容的提问来源于stack exchange,提问作者Ragg47
相关产品推荐
相关产品推荐

