基于ggplot绘制城乡O3、PM10、PM2.5月度对比柱状图问题求助
解决城乡三种污染物月度对比柱状图绘制问题
你的原代码无法得到预期效果,核心原因是ggplot2要求数据为长格式,但当前数据集是宽格式(O3、PM10、PM2.5作为独立列),直接在aes()里同时指定多个y轴和填充变量不符合语法规范。
解决步骤
- 转换数据格式:用
tidyr包的pivot_longer函数把宽格式数据转成长格式,将三种污染物合并为一个分类列,对应浓度值单独成列。 - 重构绘图代码:基于长格式数据配置ggplot参数,让同月份的不同污染物柱子并排展示,再按城乡分面。
完整可运行代码
# 先加载必要包(如果没加载过) library(tidyverse) data %>% # 转换为长格式:将O3、PM10、PM2.5转为"污染物"和"浓度"两列 pivot_longer( cols = c(O3, PM10, PM2.5), names_to = "污染物", values_to = "浓度" ) %>% ggplot(aes(x = Month_name, y = 浓度, fill = 污染物)) + # 让同月份的不同污染物柱子并排,避免重叠 geom_col(position = position_dodge(width = 0.8), width = 0.7) + # 按城乡区域分面展示 facet_wrap(~landtype) + # 设置图表标签,提升可读性 labs( title = "城乡空气质量污染物月度对比", x = "月份", y = "污染物浓度", fill = "污染物类型" ) + # 可选:使用简洁主题优化视觉效果 theme_minimal()
关键说明
pivot_longer:这是解决问题的核心,把宽格式数据转换为ggplot2能识别的长格式结构。position_dodge:控制柱子的排列方式,让同一分组下的不同类别柱子并排显示,避免堆叠或重叠。labs:替换默认的轴标签和标题,让图表信息更清晰直观。
内容的提问来源于stack exchange,提问作者user18343293
相关产品推荐
相关产品推荐

