使用 ggplot 创建多个堆叠的小提琴图

Create multiple stacked violin plots with ggplot

我有一个在不同景观上运行的模型,一次同时运行,一次单独运行。 我想在小提琴情节中绘制结果,但我希望在同一个情节中并排运行,并且每个景观都有自己的小提琴(所以集体 4 2 stacks 小提琴)。 示例数据:

df1 <- data.frame('means' = 1:6, 'landscape' = rep(c('forest', 'desert', 3)))
df2 <- data.frame('means' = rep(c(1,2), 3), 'landscape' = rep(c('forest', 'desert', 3)))

我希望最终产品看起来像什么(MS Paint 中的插图,我是一个糟糕的艺术家):

绿色代表森林,金色代表沙漠。

使用 ggplot - 您可以添加两个 geom_violin() 并在第二个中使用新数据。

我使用 mtcars 作为示例数据。

library(tidyverse)

df1 <- mtcars[1:15, ]
df2 <- mtcars[16:31, ]

df1 %>% 
  ggplot(aes(factor(vs), disp)) + 
  geom_violin() + 
  geom_violin(data = df2, 
              aes(factor(vs), disp))

编辑

如果可能的话,我认为更简单的方法是将数据框合并为一个,并为每个数据框创建一个密钥以备后用。 为了组合 data.frames,我使用了 bind_rows,它将 data.frames 绑定在其他之上。参数 .id = 使我能够添加一个带有 data.frame 名称的新列。接下来,在 ggplot 中,您可以将 aes color 设置为您提供的 data.frame id。这将为每个 data.frame 赋予不同的颜色。此外,在 geom_violin 中添加 position = "identity" 可以让它们相互堆叠。

bind_rows(list(df1 = df1, df2 = df2),
          .id = "dfName") %>% 
  ggplot(aes(factor(vs), disp, color = dfName)) + 
  geom_violin(position = "identity")

请注意,此 post 隐含地询问 "how to have violin geoms printed above each other?"。这当然是通过 position 参数来回答的,小提琴默认为 'dodge' - 将其更改为 'identity' 就可以了。小旁注 - 要求 "stacking" 实际上有点误导,因为 position='stack' 会垂直堆叠它们。

这种方法特别避免了笨重的第二个数据集,因此可以轻松处理多种颜色。

library(tidyverse)

mpg %>%
  filter(class %in% c("compact","midsize")) %>%
  mutate(coloringArgument = paste(drv,class)) %>%
  ggplot(aes(as.factor(drv), cty, color=coloringArgument)) + 
  geom_violin(position = "identity")