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é
相关产品推荐
相关产品推荐

