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

时间:2019-12-01 09:52:26

标签: r ggplot2 violin-plot

我有一个模型可以在不同的景观上运行,一次可以同时运行,一次可以分别运行。 我想将结果绘制在小提琴图中,但我希望两者在同一个图中并排运行,并且每个风景区都有自己的小提琴(因此,总共2堆中的 4小提琴强>)。 示例数据:

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中的插图,我是一个糟糕的艺术家): enter image description here

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

2 个答案:

答案 0 :(得分:4)

请注意,该帖子暗含询问“如何在彼此上方印刷小提琴字体?”。当然,这可以通过position参数来回答,对于小提琴,该参数默认为'dodge'-将其更改为'identity'可以解决问题。旁白-要求“堆叠”实际上有点误导,因为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")

答案 1 :(得分:2)

使用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))

enter image description here

编辑

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

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

enter image description here