R语言 在同一图形ggplot2中获取两个条形图

e4eetjau  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(242)

我有两个 Dataframe :

df1 <- data.frame(name = rep(LETTERS[1:5], each = 5), age = 1:25)
df2 <- data.frame(name = rep(LETTERS[1:5], each = 5), age = c(rep(1,5), rep(5,5), 1,12,3,2,1,1:5,6:10))

我想画出这样的水平条形图:

df1 %>%
  mutate(name = fct_reorder(name, age)) %>%
  ggplot( aes(x = name, y = age)) +
  geom_bar(stat = "identity", fill = "#74D055FF", alpha = .6, width = .6) +
  coord_flip() +
  theme_bw()

df2 %>%
  mutate(name = fct_reorder(name, age)) %>%
  ggplot( aes(x = name, y = age)) +
  geom_bar(stat = "identity", fill = "#481568FF", alpha = .6, width = .6) +
  coord_flip() +
  theme_bw()

我想在同一张图中显示它们:应该有一条垂直线对应age = 0,然后紫色条应该在一侧,绿色条在另一侧(当然它随后将仅基于df1df2中的age被排序,因为age的降序在两个 Dataframe 中是不同的)。我不知道如何调用这种类型的图以及如何处理它。

bfnvny8b

bfnvny8b1#

一种选择是将数据集绑定到一个 Dataframe 中,并添加一个标识符列,我使用dplyr::bind_rows来标识该列,然后可以将标识符Map到fill aes上,并通过scale_fill_manual设置颜色。此外,我使用count聚合数据,而不是依赖于堆栈:

library(dplyr)
library(ggplot2)

dplyr::bind_rows(df1, df2, .id = "id") %>%
  count(id, name, wt = age, name = "age") |>
  mutate(
    name = reorder(name, (id == 1) * age, sum),
    age = if_else(id == 2, -age, age)
  ) |>
  ggplot(aes(y = name, x = age, fill = id, group = 1)) +
  geom_col(alpha = .6, width = .6) +
  geom_vline(xintercept = 0) +
  scale_fill_manual(values = c("#74D055FF", "#481568FF")) +
  theme_bw()

相关问题