You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:17:48