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

如何在ggplot2中绘制站点分组的物种百分比堆叠柱状图

Fixing Stacked Bar Chart to Show Percentages in ggplot2

Let's break down how to fix your stacked bar chart so it displays percentages on the Y-axis instead of species names. The core issue right now is that you're mapping y=Species (a categorical variable) instead of a numerical percentage value. Here's the step-by-step solution:

1. Prepare Your Data (Critical First Step)

Your data is likely in wide format (one column per species), but ggplot needs long format (one row per station-species combination) to calculate and plot percentages properly. We'll use the tidyverse package for this work:

First, load the necessary packages:

library(tidyverse)
# Install if needed: install.packages("tidyverse")

Convert Wide Data to Long Format

Assuming your dataset has columns like Station, SpeciesA, SpeciesB, etc. (each species column holds count values for that species at the station), use pivot_longer to reshape the data:

data_long <- your_data %>%
  pivot_longer(
    cols = -Station,  # Keep Station as the identifier column
    names_to = "Species",  # Name for the new species label column
    values_to = "Count"    # Name for the new species count column
  )

Calculate Percentages per Station

Next, compute the percentage of each species relative to the total count at its station:

data_percent <- data_long %>%
  group_by(Station) %>%  # Group data by each monitoring station
  mutate(
    Percentage = (Count / sum(Count)) * 100  # % = (species count / total station count) * 100
  ) %>%
  ungroup()

2. Plot the Stacked Bar Chart with Percentages

Now use the processed data to build your plot, mapping y=Percentage instead of y=Species:

ggplot(data = data_percent, aes(x = Station, y = Percentage, fill = Species)) +
  geom_col(position = "stack") +  # Stacked bars (default, included for clarity)
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1)  # Improve x-axis label readability
  ) +
  labs(
    x = "Cameras",
    y = "Percentage",
    fill = "Species"
  ) +
  # Optional: Format Y-axis to show % symbols (e.g., 50% instead of 50)
  scale_y_continuous(labels = scales::percent_format(scale = 1))

Key Fixes Explained:

  • y=Percentage: This replaces the categorical Species variable with a numerical percentage value, so your Y-axis will show percentage values instead of species names.
  • Data Reshaping: Converting to long format lets ggplot correctly map each species' percentage to its segment in the stacked bar.
  • Percentage Calculation: Grouping by Station ensures percentages are calculated relative to the total count at each individual station, not the entire dataset.

If your original data structure is slightly different (e.g., species labels are in a separate column with counts spread across station columns), adjust the pivot_longer arguments to match your actual column names—but the core logic of calculating per-station percentages and mapping y to that value remains the same.

内容的提问来源于stack exchange,提问作者Eléonore Zittoun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:22:49