组合重叠的组以包括在R中的小提琴图/箱图中

时间:2019-05-23 04:24:58

标签: r ggplot2 grouping violin-plot ggpubr

我正在使用虹膜数据集来处理以下代码。我想画一个小提琴图,只包括setosa种类,并对数据子集进行一些复杂的重叠组合。

具体来说,我想在x轴上首先将连续的Sepal.Length数据分为几组:A组= Sepal.Length <4.7,B组= Sepal.Length 4.7-5,C组= Sepal.Length 5-5.2,组D = Sepal.Length> 5.2。

然后,我想在x轴上绘制四个小提琴/盒子,单个/重叠的组:“ B”,“ A + C”,“ D”,“ A + C + D”。 y轴就是“ Petal.Length”。

我还包括用于显示每个小提琴的样本大小(n)的代码。

任何建议,我将不胜感激。谢谢。

library(dplyr)
library(ggplot2)
library(ggpubr)
# Define order of violins on x-axis.
order <- c("B", "AC", "D", "ACD")
# Function to display sample size (n) for each violin.
give.n <- function(x){return(c(y = min(Petal.Length), label = length(x)))}
iris %>% 
  filter(Species == "setosa") %>% 
  mutate(sub_a = case_when( Sepal.Length < 4.7~"A",
                        Sepal.Length < 5~ "B",
                        Sepal.Length < 5.2~ "C",
                        TRUE~"D")) %>% 
  mutate(collapsed = c((ifelse(sub_a %in% c("A", "C"), "AC", sub_a)), (ifelse(sub_a %in% c("AC", "D"), "ACD", sub_a)))) %>% 
  ggviolin(iris[iris$Species == "setosa", ], x=collapsed, y=Petal.Length) + scale_x_discrete(limits=order) + stat_summary(fun.data = give.n, geom = "text")

修改

有关预期结果,请参见下文。请注意,每个小提琴下面的数字都是准确的。图片的其余部分只是预期结果的一个例子。

enter image description here

1 个答案:

答案 0 :(得分:2)

我看不到如何做到这一点,但这是一个使用cut然后使用bind_rows的蛮力解决方案

setosa <- iris %>% filter(Species == "setosa")  %>% 
  mutate(group = cut(Sepal.Length, breaks = c(0, 4.7, 5, 5.2, Inf), labels = c("A", "B", "C", "D"), right = FALSE))

bind_rows(B = setosa %>% filter(group == "B"),
          AC =  setosa %>% filter(group %in% c("A", "C")),
          D =  setosa %>% filter(group == "D"),
          ACD = setosa %>% filter(group %in% c("A", "C", "D")),
          .id = "group2"
          ) %>% 
  mutate(group2 = factor(group2, levels = c("B", "AC", "D", "ACD"))) %>% 
  ggplot(aes(x = group2, y = Petal.Length)) + 
  geom_violin()