如何基于第二个数据框中的列创建分面

How to create a faceting based on a column in second dataframe

我想创建一个如下所示的图表:

现在我找到了 cowplot 包,它给了我一个非常相似的结果。

library(ggplot2)
library(cowplot)
library(data.table)
library(ggridges)

d = data.table(iris)

a = ggplot(data = d, aes(x=Sepal.Length, y=..count..)) +
  geom_density_line() + 
  geom_density_line(data = d[Species == "virginica"], aes(), fill="lightblue", color="darkblue") +
  theme_bw()

b = ggplot(data = d, aes(x=Sepal.Length, y=..count..)) +
  geom_density_line() + 
  geom_density_line(data = d[Species == "versicolor"], aes(), fill="lightgreen", color="darkgreen") +
  theme_bw()

cowplot::plot_grid(a, b, labels=NULL)

结果如下:

但是,有两点困扰我:

  • 它在两个图中都有一个 y 轴
  • 我的真实数据最多有10个网格,代码变得很长

我认为一定可以使用 facet_grid()facet_wrap() 或类似的东西来实现这一点。但是我不知道如何在没有 changing/losing 灰色背景图的情况下使用第二个几何数据框中的列来创建这些子集。

我们可以在没有 Species 的情况下向一层提供数据版本,因此它计算整个事物作为我们的背景上下文,另一层包含 Species 以将其映射到 fill 并转到适当的方面。

library(ggplot2); library(ggridges)
ggplot(data = iris, aes(Sepal.Length, ..count..)) +
  geom_density_line(data = subset(iris, select = -Species)) +
  geom_density_line(aes(fill = Species)) +
  facet_wrap(~Species)