如何在ggplot中同时展示两个变量?数据集与实现需求问询
解决方法
你的问题出在数据格式和绘图逻辑上:原代码只绘制了Forest这一个指标,还错误地用Lakes做分面,导致每个分面只显示单个地区的森林数据,完全没法同时对比同一地区的森林和湖泊数量。
要实现「x轴显示地区,同时展示每个地区的森林和湖泊数量」的效果,核心是把宽格式数据转成长格式,让ggplot能同时识别两个指标。
步骤1:转换数据格式
用tidyr::pivot_longer把宽格式(Forest、Lakes作为列)转成长格式(把这两列合并成「类别-数值」的结构):
# 先加载tidyverse包(包含dplyr、ggplot2、tidyr) library(tidyverse) # 转换数据 data_long <- data %>% pivot_longer( cols = c(Forest, Lakes), # 要转换的目标列 names_to = "Category", # 新的类别列名称 values_to = "Area" # 新的数值列名称 )
转换后的数据结构示例:
| Region | Category | Area |
|---|---|---|
| North | Forest | 30 |
| North | Lakes | 40 |
| West | Forest | 40 |
| West | Lakes | 100 |
步骤2:绘制对比柱状图
用长格式数据绘图,通过fill参数区分森林和湖泊,用position_dodge让同一地区的两个柱子并排显示,方便直接对比:
ggplot(data_long, aes(x = Region, y = Area, fill = Category)) + geom_col(position = position_dodge(width = 0.8)) + # 控制柱子间距,避免重叠 labs( title = "不同地区的森林与湖泊面积", x = "地区", y = "面积", fill = "类别" ) + theme_minimal()
可选:堆叠柱状图
如果想展示同一地区的总面积及两类区域的占比,可以去掉position_dodge,使用默认的堆叠模式:
ggplot(data_long, aes(x = Region, y = Area, fill = Category)) + geom_col() + labs( title = "不同地区的森林与湖泊面积(堆叠)", x = "地区", y = "面积", fill = "类别" ) + theme_minimal()
内容的提问来源于stack exchange,提问作者user19729000
相关产品推荐
相关产品推荐

