如何使用ggplot绘制双柱状图展示各城市政治竞选两类捐款数据
ggplot2双柱状图实现方案调整
你当前的代码无法实现需求的核心原因是数据格式和美学映射不匹配:
- 原始
recall_contribs为宽格式,反对者、支持者捐款是两个独立列,无法直接作为分组字段生成双柱 - 现有代码仅映射了反对者捐款为y轴,填充字段设置为城市,不能区分两类捐款的柱子
调整步骤
- 第一步:将宽表转为长表,新增「捐款群体」「捐款金额」两个字段,用于后续分组映射
- 第二步:调整ggplot的美学映射规则,把捐款群体设为填充字段,保留
position="dodge"实现同城市双柱并列 - (可选)补充坐标轴、图例配置,提升图表可读性
完整可运行代码
# 未安装依赖包先运行:install.packages("tidyverse") library(tidyverse) # 原始数据 city <- c("Del Mar","Solana Beach","Encinitas") opponents <- c(30046,4551,24591) supporters <- c(7200,550,5775) recall_contribs <- data.frame(city,opponents,supporters) # 宽表转长表 recall_contribs_long <- recall_contribs %>% pivot_longer( cols = -city, names_to = "捐款群体", values_to = "捐款金额" ) # 绘图代码 ggplot(recall_contribs_long, aes(x = city, y = 捐款金额, fill = 捐款群体)) + geom_bar(stat = "identity", position = "dodge") + # 以下为可选美化配置,不需要可删除 labs(x = "城市", y = "捐款金额", fill = "群体类型") + scale_fill_manual( values = c("opponents" = "#e64b35", "supporters" = "#4dbbd5"), labels = c("反对者", "支持者") )
如果不想引入tidyr做表转换,也可以手动叠加两个geom_bar层分别对应两类捐款,但转长表是ggplot2的标准实现逻辑,代码更简洁易维护。
内容的提问来源于stack exchange,提问作者Luke Harold
相关产品推荐
相关产品推荐

