RStudio技术求助:绘制含物种面积占比的产量柱状图
问题修正与解决方案
原代码存在的问题
- 数据结构错误:每个区域对应1个总产量值,但原数据中每个区域重复3行,且
Production仅提供4个值,导致数据行数不匹配(实际应是4行,而非12行)。 - 变量未定义:代码中使用
real_data但未对其赋值,应替换为定义好的data。 - 绘图逻辑偏差:直接用
y = Production绘制柱状图会导致每个物种都生成高度等于总产的柱子,堆叠后高度远超实际总产,不符合需求。
修正后的完整代码
1. 正确构建数据
首先调整数据结构,每个区域一行,包含区域名称、总产量和三个物种的面积占比:
# 加载所需包 library(tidyverse) # 构建正确的数据集:每个区域一行 data <- data.frame( Site = c("B1", "B2", "B3", "B4"), Production = c(385.8084, 309.8088, 274.8270, 102.6783), AreaProportion_Sp1 = c(0.835, 1, 0.274, 0.168), AreaProportion_Sp2 = c(0.164, 0, 0.074, 0), AreaProportion_Sp3 = c(0, 0, 0.65, 0.83) )
2. 转换为长格式数据
将宽格式的占比列转换为长格式,方便ggplot2绘图:
# 转换为长格式,提取物种名称和对应占比 long_data <- data %>% pivot_longer(cols = starts_with("AreaProportion_"), names_to = "Species", names_prefix = "AreaProportion_", values_to = "AreaProportion") %>% # 过滤占比为0的物种(避免绘制空分段) filter(AreaProportion > 0) %>% # 计算每个物种对应的产量分段高度(总产×占比) mutate(Segment_Production = Production * AreaProportion)
3. 绘制目标柱状图
绘制柱高为总产量,内部按物种面积占比分段,并标注占比百分比:
ggplot(long_data, aes(x = Site, y = Segment_Production, fill = Species)) + # 绘制堆叠柱状图,总高度等于各分段之和(即总产量) geom_col(width = 0.7) + # 在每个分段中心标注占比百分比 geom_text(aes(label = scales::percent(AreaProportion)), position = position_stack(vjust = 0.5), size = 3) + # 设置标题和坐标轴标签 labs(title = "各区域年产量及物种面积占比", x = "区域", y = "年产量", fill = "物种") + # 优化y轴显示格式 scale_y_continuous(labels = scales::comma) + # 使用简洁主题 theme_minimal()
代码说明
pivot_longer:将宽格式的占比列转换为长格式,便于按物种分组绘图。filter(AreaProportion > 0):过滤掉占比为0的物种,避免柱子出现空的分段。mutate(Segment_Production = Production * AreaProportion):计算每个物种对应的产量分段高度,确保堆叠后总高度等于区域总产量。position_stack(vjust = 0.5):让文本标签位于每个分段的中心位置。
内容的提问来源于stack exchange,提问作者Ana Luisa
相关产品推荐
相关产品推荐

