堆积条形图:如何定义填充

Stacked bar chart: how to define fill

再一次,我需要你的帮助,我期待着倾听和学习。

我想描述几种鸟类 (t1 - t7) 之间的相互关系。观察到它们与同类或其他类型的鸟类互动的频率 (o1 - o7)

数据(bird.data)如下所示:

type o1 o2 o3 o4 o5 o6 o7
t1 77.6 3.5 1.5 9.1 3.3 1.4 3.6
t2 10 64.4 9 3.2 2.1 7.4 3.9
t3 8.6 12.1 63.2 2.4 0.6 8.8 4.3
t4 28.7 5.1 2.0 51.4 5.8 0.3 6.6
t5 4.1 12.2 9.5 1.0 0.4 64.5 8.3
t6 10.9 3.6 0.3 6.5 66.8 2.0 9.9
t7 15.9 8.2 4.5 5.6 9.4 5.4 51.0
bird.data <- structure(list(type = c("t1”, “t2", “t3”, “t4”, “t5”, “t6”, “t7”), o1 = c(77.6, 10, 8.6, 28.7, 4.1, 10.9, 15.9), o2 = c(3.5, 64.4, 12.1, 5.1, 12.2, 3.6, 8.2), o3 = c(1.5, 9, 63.2, 2, 9.5, 0.3, 4.5), o4 = c(9.1, 3.2, 2.4, 51.4, 1, 6.5, 5.6), o5 = c(3.3, 2.1, 0.6, 5.8, 0.4, 66.8, 9.4), o6 = c(1.4, 7.4, 8.8, 0.3, 64.5, 2, 5.4), o7 = c(3.6, 3.9, 4.3, 6.6, 8.3, 9.9, 51)), row.names = c(NA, -7L), class = c("tbl_df", "tbl", "data.frame"))

为了以图形方式显示这一点,我想绘制一个翻转的堆叠条形图 - 类似于这个: (摘自此post:

我想在 x 轴(类型)上描绘不同类型的鸟类而不是县,而不是计划类型我想用不同类型鸟类之间的相互作用百分比填充条形图(o1 -o7).

我现在的问题是:

ggplot() +
geom_bar(aes(y = ?, x = type, fill = ?),
         data = bird.data,
         stat="identity") +
         coord_flip()

非常感谢您的任何建议! :-)

编辑: 我已经实施了stefan的好建议,现在遇到另一个问题:

向堆叠条形图添加标签时,vjust=0.5 不会将标签放在相应条形图的中间:

```
ggplot() +
  geom_col(aes(x = value, y = type, fill = name), 
           data = bird_data_long,
           position = position_stack(reverse = TRUE)) +
  scale_y_discrete(limits=rev) +
  geom_label(data = subset(bird_data_long, value > 10), 
            aes(x = value, y = type, label = paste0(round(value, digits = 0),"%")), 
            size = 3, position = position_stack(vjust = 0.5))
```

情节是这样的:

因此,我的问题是:如何调整标签的位置,使它们恰好位于它们所代表的栏的中间?知道为什么它们会倾斜吗?非常感谢任何建议!

您可以通过使用例如将数据转换为长格式来实现您想要的结果。 tidyr::pivot_longer。之后很简单应该映射到 filly.

注意:我使用 geom_col(...) 而不是 geom_bar(.. stat="identity")。此外,我切换了 xy.

的角色,而不是 coord_flip
library(tidyr)
library(ggplot2)

bird_data_long <- bird.data %>% 
  pivot_longer(-type, names_to = "name", values_to = "value")

head(bird_data_long)
#> # A tibble: 6 × 3
#>   type  name  value
#>   <chr> <chr> <dbl>
#> 1 t1    o1     77.6
#> 2 t1    o2      3.5
#> 3 t1    o3      1.5
#> 4 t1    o4      9.1
#> 5 t1    o5      3.3
#> 6 t1    o6      1.4

ggplot() +
  geom_col(aes(x = value, y = type, fill = name), data = bird_data_long)

编辑 主要问题是您对 geom_text 中的数据进行了子集化。因此,与条形图相比,您正在堆叠一组不同的值,以便标签的位置不再对应于条形图的位置。要摆脱较小条形图的标签,请改用 ifelse。这样您的标签就会放置在正确的位置。

ggplot() +
  geom_col(aes(x = value, y = type, fill = name), 
           data = bird_data_long,
           position = position_stack(reverse = TRUE)) +
  scale_y_discrete(limits=rev) +
  geom_label(data = bird_data_long, 
             aes(x = value, y = type, group = name, label = ifelse(value > 10, paste0(round(value, digits = 0),"%"), NA)), 
             size = 3, position = position_stack(vjust = 0.5,reverse = TRUE), na.rm = TRUE)