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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:56:00