【问题标题】:ggplot boxplot multiple columns with a factor with conditionggplot boxplot 多列具有条件的因子
【发布时间】:2017-02-27 19:34:26
【问题描述】:

示例数据框:

a <- c(1, 0, 1)
b <- c(0, 1, 0)
c <- c(1, 0, 1)
total <- c(100,200,300)
my.data <- data.frame(a, b, c, total)

> my.data
  a b c total
1 1 0 1   100
2 0 1 1   200
3 1 0 1   300

我想创建一个单独的箱线图来显示每一列的“总计”分布:a、b、c,但只考虑值 = 1 的那些。 示例:a 列的第 2 行被忽略,因为它是 0,因此 a 列的分布为 100 和 300。B 列的分布为 200,c 列的分布为 100,200,300。

我可以单独绘制它们:

ggplot(subset(my.data,a==1), aes(x=a,y=total)) + 
geom_boxplot() 

ggplot(subset(my.data,b==1), aes(x=b,y=total)) + 
geom_boxplot() 

ggplot(subset(my.data,c==1), aes(x=c,y=total)) + 
geom_boxplot()

我也尝试了以下方法,但不正确:

ggplot(my.data, aes(x=as.factor(c("a","b","c")),y=total)) + 
geom_boxplot() 

希望有一个很棒的 R 函数/方法可以让我一次性完成我的情节。不要因为 Total 列而认为我可以使用 melt() 。提前致谢。


编辑:显然,我应该/可以使用melt(),只需要正确使用它。

【问题讨论】:

    标签: r ggplot2 boxplot


    【解决方案1】:

    您的数据应该是长格式,例如使用 Reshape2 包

    library(reshape2)
    my.data <- melt(my.data, measure.vars=c("a","b","c"))
    
    ggplot(subset(my.data, value==1), aes(x=variable,y=total)) + 
    geom_boxplot() 
    

    【讨论】:

    • 漂亮!谢谢@user3640617。
    【解决方案2】:

    user3640617 的回答是正确的,但如果您想避免使用较旧的 reshape2 软件包,您可以使用较新的 tidyverse 进行等效操作:

    library(tidyverse)
    my.data <- gather(my.data, group, has.data, a:c) %>% 
        subset(has.data == 1)
    
    plot.data <- ggplot(data = my.data, aes(x = group, y = total)) +
        geom_boxplot()
    print(plot.data)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多