如何用ggplot2绘制堆叠条形图:展示前5属比例并合并其余
实现ggplot堆叠条形图:保留前5属+合并剩余类群
当然可以实现,核心是先对数据集做预处理,将前5个高频属保留原名,其余属统一归为“其他属”,再计算各分组的比例,最后用ggplot2绘图即可。
步骤1:数据预处理
先加载dplyr用于数据处理,ggplot2用于绘图,然后对数据进行排序、分组汇总和比例计算:
library(dplyr) library(ggplot2) # 修正示例数据(原数据中"N"未加引号,且行号与数据行数不匹配,这里统一修正) df <- structure(list(Genus = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N"), Frequency = c(1580, 1456, 927, 900, 625, 611, 535, 534, 452, 341, 323, 314, 254, 247)), row.names = c(NA, 14L), class = "data.frame") # 数据预处理:分组并计算比例 df_processed <- df %>% arrange(desc(Frequency)) %>% # 按频率从高到低排序 mutate(Genus_group = ifelse(row_number() <= 5, Genus, "其他属")) %>% # 标记前5属和剩余属 group_by(Genus_group) %>% summarise(total_freq = sum(Frequency)) %>% # 分组汇总总频率 mutate(prop = total_freq / sum(total_freq)) %>% # 计算各分组占比 arrange(desc(prop)) # 按占比降序排列,保证前5属优先显示
步骤2:绘制堆叠条形图
用geom_col绘制堆叠条形,同时添加百分比标签,让比例更直观:
ggplot(df_processed, aes(x = "", y = prop, fill = Genus_group)) + geom_col(width = 0.6) + # 设置条形宽度 geom_text(aes(label = scales::percent(prop, accuracy = 0.1)), position = position_stack(vjust = 0.5)) + # 居中显示百分比标签 scale_fill_brewer(palette = "Set3") + # 选择配色方案 scale_y_continuous(labels = scales::percent) + # y轴显示百分比格式 labs(title = "属级类群比例分布", x = "", y = "比例") + theme_minimal() + theme(axis.text.x = element_blank()) # 隐藏x轴无意义的刻度文本
处理后的图表会单独展示前5个属的精确比例,所有剩余属的总比例合并为“其他属”呈现,完全满足你的需求。
内容的提问来源于stack exchange,提问作者YYM17
相关产品推荐
相关产品推荐

