ggplot boxplot带有条件因子的多列

时间:2017-02-27 19:34:27

标签: r ggplot2 boxplot

示例数据框:

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

我想创建一个单一的boxplot来显示每列的“total”分布:a,b,c但只考虑value = 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(),只需要正确使用它。

2 个答案:

答案 0 :(得分:2)

您的数据应采用长格式,使用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() 

答案 1 :(得分:1)

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)