How to add a line in boxplot?

后端 未结 5 954
日久生厌
日久生厌 2021-02-04 09:14

I would like to add lines between \"mean\" in my boxplot.

My code:

library(ggplot2)
library(ggthemes)

Gp=factor(c(rep(\"G1\",80),rep(\"G2\",80)))
Fc=fac         


        
5条回答
  •  傲寒
    傲寒 (楼主)
    2021-02-04 09:46

    You can try a tidyverse solution as well:

    library(tidyverse)
    DATA %>% 
       ggplot() + 
       geom_boxplot(aes(X, Y, fill=Z)) +
       stat_summary(aes(X, Y,fill=Z),fun.y = mean, geom = "point",
                    position=position_nudge(x=c(-0.185,0.185))) +
       geom_segment(data=. %>%
                      group_by(X, Z, Gp , Fc) %>% 
                      summarise(M=mean(Y)) %>% 
                      ungroup() %>% 
                      mutate(Z=paste0("C",Z)) %>% 
                      spread(Z, M), aes(x = as.numeric(X)-0.185, y = C100, 
                        xend = as.numeric(X)+0.185, yend = C50)) +
       facet_grid(Gp ~ Fc)
    

    The idea is the same as in the answer of d.b.. Create a data.frame for the geom_segment call. the advantage is the dplyr workflow. So everything is done in one run.

    DATA %>% 
      group_by(X, Z, Gp , Fc) %>% 
      summarise(M=mean(Y)) %>% 
      ungroup() %>% 
      mutate(Z=paste0("C",Z)) %>% 
      spread(Z, M) 
    # A tibble: 8 x 5
           X     Gp     Fc  C100   C50
    *     
    1     B1     G1    FC1 0.169 0.281
    2     B1     G1    FC2 0.170 0.294
    3     B1     G2    FC1 0.193 0.270
    4     B1     G2    FC2 0.168 0.269
    5     B2     G1    FC1 0.171 0.276
    6     B2     G1    FC2 0.161 0.292
    7     B2     G2    FC1 0.188 0.269
    8     B2     G2    FC2 0.163 0.264
    

    Or you can try a slighlty different approach compared to Julius' answer. Add breaks and labels to get the expected output and play around with some offset on a numeric X2 and the width parameter within the boxplot function to get the boxes plotted together.

    DATA %>% 
      mutate(X2=as.numeric(interaction(Z, X))) %>% 
      mutate(X2=ifelse(Z==100, X2 + 0.2, X2 - 0.2)) %>% 
      ggplot(aes(X2, Y, fill=Z, group=X2)) + 
       geom_boxplot(width=0.6) +
       stat_summary(fun.y = mean, geom = "point") +
       stat_summary(aes(group = X),fun.y = mean, geom = "line") +
       facet_grid(Gp ~ Fc) +
       scale_x_continuous(breaks = c(1.5,3.5), labels = c("B1","B2"),
                            minor_breaks = NULL, limits=c(0.5,4.5))
    

提交回复
热议问题