使用 3 个变量从 2 个数据帧堆叠条形图

问题描述 投票:0回答:1

我希望在 R 中创建一个条形图,结合来自 2 个不同数据帧的数据并使用第三个变量作为填充。

数据:

all_spp <- data.frame(NAME=c("A", "B", "C", "D"), spp=c(9, 5, 8, 6), cat=c("I", "II", "III", "IV") )

listed_spp <- data.frame(NAME=c("A", "B", "C", "D"), en_spp=c(1, 3, 2, 3) )

数据描述了保护区 (

NAME
)、物种总数 (
spp
) 与濒危物种 (
en_spp
) 以及保护区的保护级别 (
cat
)。我正在尝试创建一个条形图,描绘保护区 (
x=spp
) 的物种总数 (
y=NAME
),并在相应的保护级别 (
fill=cat
) 填充中着色。在每个区域的每个条形的顶部,我想将濒危物种 (
x=en_spp
) 显示为散列条形。

我尝试组合两个数据框并使用

melt
函数,但是,这不允许我使用
fill=cat
,也没有添加相应的正确图例。

这是我一直在尝试使用但不起作用的代码

ggplot(data=all_spp, aes(x = spp, y = reorder(NAME, spp), fill=cat),) +
  geom_bar(stat = "identity", position="stack") +
  geom_bar(listed_spp, mapping=aes(x=en_spp, y=reorder(NAME, en_spp))) +
  scale_x_continuous(limits = c(0,10), expand = c(0, 0)) +
  theme_bw() +
  theme(axis.text.y=element_text(size=18)) +
  scale_fill_manual(breaks=c("I", "II", "III", "IV"),
                    values = c("I" = "#004B57",
                               "II" ="#007AA2",
                               "III" = "#008DC0",
                               "IV" = "#009DCF"))

下面的图片描绘了我正在寻找的输出:

任何解决方案的想法将不胜感激。

r ggplot2 bar-chart reshape2
1个回答
0
投票

您可以使用

ggpattern
包来执行此操作。它很像这个答案,但对两个不同的数据集进行了调整。

library(ggpattern)
library(ggplot2)  

all_spp <- data.frame(NAME=c("A", "B", "C", "D"), spp=c(9, 5, 8, 6), cat=c("I", "II", "III", "IV") )
listed_spp <- data.frame(NAME=c("A", "B", "C", "D"), en_spp=c(1, 3, 2, 3) )

ggplot(data = all_spp, aes(x = spp, y = reorder(NAME, spp), fill = cat)) +
  geom_bar(stat="identity") + 
  geom_bar_pattern(data=listed_spp, aes(y=NAME, x=en_spp, pattern = "Endangered"), 
           stat="identity", 
           alpha=0,
           color = "black", 
           pattern_fill = "black",
           pattern_angle = 45,
           pattern_density = 0.1,
           pattern_spacing = 0.025,
           pattern_key_scale_factor = 0.6, inherit.aes=FALSE) + 
  labs(pattern = "", y="Name", x="# Species") + 
  scale_x_continuous(limits = c(0,10), expand = c(0, 0)) +
  theme_bw() +
  theme(axis.text.y=element_text(size=18)) +
  scale_fill_manual(breaks=c("I", "II", "III", "IV"),
                    values = c("I" = "#004B57",
                               "II" ="#007AA2",
                               "III" = "#008DC0",
                               "IV" = "#009DCF"))

创建于 2024-02-02,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.