如何在R中基于两个DataFrame绘制带填充的堆叠斜线条形图?
解决方案
核心思路
不用melt重塑数据,直接合并两个数据框后,通过双层条形图实现需求:底层展示总物种数(按保护等级填充颜色),上层叠加濒危物种数(用斜纹图案区分)。斜纹填充需要借助ggpattern包实现。
步骤与代码
1. 合并数据框
用merge()按NAME字段匹配两个数据集,确保每个保护区的总物种数和濒危物种数对应:
# 替换为你的真实数据 all_spp <- data.frame( NAME = c("保护区A", "保护区B", "保护区C"), spp = c(120, 95, 150), cat = c("一级", "二级", "一级") ) listed_spp <- data.frame( NAME = c("保护区A", "保护区B", "保护区C"), en_spp = c(25, 18, 32) ) # 合并数据 merged_data <- merge(all_spp, listed_spp, by = "NAME")
2. 绘制双层横向条形图
先安装并加载ggpattern包,再用ggplot的两层条形图层实现叠加:
# 首次运行需安装包 # install.packages("ggpattern") library(ggplot2) library(ggpattern) ggplot(merged_data, aes(y = reorder(NAME, spp), x = spp)) + # 底层:总物种数条形,按保护等级填色 geom_bar(stat = "identity", aes(fill = cat), width = 0.7) + # 上层:濒危物种数条形,斜纹填充 geom_bar_pattern( stat = "identity", aes(x = en_spp), pattern = "stripe", pattern_fill = "black", fill = "white", width = 0.7 ) + # 自定义标签与主题 labs(y = "保护区名称", x = "物种数量", fill = "保护等级") + theme_minimal()
关键说明
reorder(NAME, spp)可让保护区按总物种数从少到多排序,若不需要排序,直接用y = NAME即可。geom_bar_pattern的pattern参数可更换图案类型(如"crosshatch"交叉纹),pattern_fill控制线条颜色,fill设置条形底色。- 若无需图案,也可直接用第二层
geom_bar设置不同填充色,但斜纹更适合在同色系背景下区分叠加元素,避免颜色冲突。
内容的提问来源于stack exchange,提问作者Kristina
相关产品推荐
相关产品推荐

