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

R语言ggplot2绘制Y轴为百分比的9分类分组条形图求助

R语言ggplot2分组百分比条形图实现方案

核心思路

你当前卡壳的核心原因是原始数据为宽表格式,需要转换为ggplot2要求的长表结构,无需手动拼接site和condition向量,代码容错率更高。

完整实现代码

# 加载所需包
library(dplyr)
library(tidyr)
library(ggplot2)

# 1. 构建原始宽格式数据框
raw_df <- data.frame(
  x = c("1", "2", "3", "4-1", "4-2", "4-3", "4-4", "4-5", "5"),
  a = c(0.380, 0.395, 0.235, 0.040, 0.090, 0.000, 0.040, 0.000, 0.000),
  b = c(45.200, 19.790, 8.215, 14.045, 6.725, 6.655, 11.375, 8.170, 1.545),
  c = c(3.350, 29.770, 41.355, 35.775, 42.875, 43.195, 38.370, 41.725, 48.610),
  d = c(0.015, 0.450, 0.190, 0.140, 0.310, 0.150, 0.210, 0.090, 0.070),
  e = c(-0.27, -0.22, -0.35, -0.55, -0.60, -0.71, -0.85, -0.71, -0.40)
)

# 2. 宽表转长表,直接生成符合要求的绘图数据框
plot_df <- raw_df %>%
  # 生成x轴的site标签,匹配你需要的格式
  mutate(site = paste0(e, " (site ", x, ")")) %>%
  # 将a/b/c/d四个分组列转为长格式
  pivot_longer(cols = c(a, b, c, d),
               names_to = "condition",
               values_to = "value") %>%
  # 替换分组名为你定义的沉积物类型名
  mutate(condition = case_match(condition,
                                "a" ~ "gravier",
                                "b" ~ "sable_grossier",
                                "c" ~ "sable_fin",
                                "d" ~ "vase"))

# 3. 绘制分组条形图
ggplot(plot_df, aes(fill = condition, y = value, x = site)) + 
  geom_bar(position = "dodge", stat = "identity") +
  # Y轴设置为百分比显示
  scale_y_continuous(labels = function(x) paste0(x, "%")) +
  # 调整x轴标签角度避免重叠
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  # 自定义坐标轴和图例标题
  labs(x = "站点", y = "占比", fill = "沉积物类型")

手动构造value向量的替代方案(不推荐,易出错)

如果不想使用tidyverse系列包,可以手动拼接value向量,注意你之前的condition代码重复次数写错了,9个分类每个4组,应该重复9次而非4次:

site <- c(rep("-0.27 (site 1)" , 4) , rep("-0.22 (site 2)" , 4) , rep("-0.35 (site 3)" , 4),
          rep("-0.55 (site 4-1)" , 4), rep("-0.60 (site 4-2)" , 4) ,rep("-0.71 (site 4-3)" , 4),
          rep("-0.85 (site 4-4)" , 4) ,rep("-0.71 (site 4-5)" , 4) ,rep("-0.40 (site 5)" , 4))

condition <- rep(c("gravier" , "sable_grossier" , "sable_fin", "vase") , 9)

# 按行依次拼接每个站点的a/b/c/d数值
value <- c(0.380,45.200,3.350,0.015,
           0.395,19.790,29.770,0.450,
           0.235,8.215,41.355,0.190,
           0.040,14.045,35.775,0.140,
           0.090,6.725,42.875,0.310,
           0.000,6.655,43.195,0.150,
           0.040,11.375,38.370,0.210,
           0.000,8.170,41.725,0.090,
           0.000,1.545,48.610,0.070)

DF <- data.frame(site, condition, value)

内容的提问来源于stack exchange,提问作者Von Linné

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:54:04