【问题标题】:How to split multiple-column boxplot by values?如何按值拆分多列箱线图?
【发布时间】:2020-10-19 23:11:03
【问题描述】:

试图搜索但没有找到我需要的东西。 我将使用代码来演示我需要什么。

col1=c(4,5,6,4,3,4,5,5,6,9,2,1,0,3,6,7,9);
col2=c(4,2,3,4,3,3,5,6,6,9,2,1,0,3,6,7,1);
col3=c(1,2,3,4,3,4,5,5,6,9,2,1,0,3,6,7,9);
col4=c(4,5,2,4,3,4,2,5,6,5,2,3,0,3,3,7,8);
col5=c("Y","N","N","Y","N","N","Y","N","N","Y","N","N","Y","N","N","Y","N")
d=data.frame(col1,col2,col3,col4,col5)
boxplot(d[,3]~d$col5) # this works, and I got two box bars for col3 and one bar for value "N" in col5 and the other for "Y"
boxplot(d[,1:4]~d$col5) # this does not work. I want 8 bars in the order of col1 N, col1Y, col2 N, col2 Y, ...

如何获得我需要的东西?谢谢!

【问题讨论】:

    标签: r split multiple-columns boxplot


    【解决方案1】:

    将此视为一种选择。您可以将数据重塑为长期保留 x 轴所需的变量。然后,您可以使用带有facet_wrap() 的构面,以便按剩余变量进行拆分。这里的代码使用ggplot2 和一些tidyrdplyr 函数:

    library(ggplot2)
    library(dplyr)
    library(tidyr)
    #Data
    col1=c(4,5,6,4,3,4,5,5,6,9,2,1,0,3,6,7,9);
    col2=c(4,2,3,4,3,3,5,6,6,9,2,1,0,3,6,7,1);
    col3=c(1,2,3,4,3,4,5,5,6,9,2,1,0,3,6,7,9);
    col4=c(4,5,2,4,3,4,2,5,6,5,2,3,0,3,3,7,8);
    col5=c("Y","N","N","Y","N","N","Y","N","N","Y","N","N","Y","N","N","Y","N")
    d=data.frame(col1,col2,col3,col4,col5)
    #Plot
    d %>% pivot_longer(-c(col5)) %>%
      ggplot(aes(x=col5,y=value))+
      geom_boxplot()+
      facet_wrap(.~name,nrow = 1,strip.position = 'bottom')+
      theme_bw()+
      theme(strip.placement = 'outside',strip.background = element_blank())
    

    输出:

    或者,如果您想要一些时尚情节,请尝试添加 JAMA 这样的颜色:

    library(ggsci)
    #Plot 2
    d %>% pivot_longer(-c(col5)) %>%
      ggplot(aes(x=col5,y=value,fill=name))+
      geom_boxplot()+
      facet_wrap(.~name,nrow = 1,strip.position = 'bottom')+
      theme_bw()+
      labs(fill='Variable')+
      theme(strip.placement = 'outside',
            strip.background = element_blank(),
            axis.text = element_text(color='black',face='bold'),
            axis.title = element_text(color='black',face='bold'),
            legend.text = element_text(color='black',face='bold'),
            legend.title = element_text(color='black',face='bold'),
            strip.text = element_text(color='black',face='bold'))+
      scale_fill_jama()
    

    输出:

    【讨论】:

    • 不错。谢谢!接受
    【解决方案2】:

    与 Duck 的解决方案非常相似,通过颜色将 Y 和 N 分开:

    library(ggplot2)
    
    d=data.frame(col1,col2,col3,col4,col5)
    df = tidyr::pivot_longer(d, cols=1:4)
    
    ggplot(df, aes(x=name, y=value, color=col5)) + geom_boxplot()
    

    输出:

    【讨论】:

    • 我喜欢这里的简洁。给你一个。谢谢!
    【解决方案3】:

    base R 中,我们可以在一行中完成此操作

    boxplot(values ~ Label:ind, data.frame(stack(d[-5]) , Label = d$col5))
    

    -输出


    或者从ggpubr 使用ggboxplot 的另一个选项,而不重塑原始数据集

    library(ggpubr)
    ggboxplot(d, x = "col5", y = c("col1", "col2", "col3", "col4"), 
     combine = TRUE, add = "jitter", color = "col5",
           palette = c("#00AFBB", "#E7B800", "#FC4E07", "#FA5D09"))
    

    -输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 2014-06-07
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      相关资源
      最近更新 更多