使用ggplot绘制双数据集柱状图,实现X轴按数据集分组展示
解决思路与代码实现
要实现两类数据按颜色分组聚集、X轴标签独立的柱状图,核心是统一数据结构+强制X轴顺序+统一数值单位,以下是具体步骤:
1. 数据预处理(关键步骤)
首先统一两个数据集的列结构,添加分组标识,并修正数值单位(解决Y轴异常问题):
library(tidyverse) # 处理树木正服务数据:重命名问题列+添加分组标签 ess_clean <- essNeighbor %>% rename(statement = ESS) %>% mutate(type = "树木正服务") # 处理树木负服务数据:重命名问题列+添加分组标签+将小数转为百分比 dss_clean <- dssNeighbor %>% rename(statement = DSS) %>% mutate(type = "树木负服务", agree = agree * 100) # 与正服务的百分比单位统一,避免Y轴刻度异常 # 合并数据并强制X轴顺序:先正服务的所有表述,再负服务的所有表述 combined_data <- bind_rows(ess_clean, dss_clean) %>% mutate(statement = factor(statement, levels = c(ess_clean$statement, dss_clean$statement)))
2. 绘制柱状图
使用ggplot绘制,指定颜色映射并优化显示效果:
ggplot(combined_data, aes(x = statement, y = agree, fill = type)) + geom_col(width = 0.8) + # 自定义浅绿、深绿配色 scale_fill_manual(values = c("树木正服务" = "#a5d6a7", "树木负服务" = "#2e7d32")) + labs(title = "树木正负服务认可度对比", x = "具体表述", y = "认可度(%)", fill = "服务类型") + # 旋转X轴标签,避免长文本重叠 theme(axis.text.x = element_text(angle = 45, hjust = 1))
问题说明
- 你之前遇到的Y轴异常,大概率是因为两类数据的
agree单位不统一(负服务是小数,正服务是百分比),统一单位后即可解决。 - 强制
statement的因子水平顺序,能让X轴按「正服务所有表述→负服务所有表述」排列,自然实现同组数据聚集,不会出现交错。
内容的提问来源于stack exchange,提问作者Pied Piper
相关产品推荐
相关产品推荐

