[英]ggplot boxplot multiple columns with a factor with condition
数据框示例:
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(),只需要正确使用它即可。
您的数据应为长格式,例如,使用软件包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的答案是正确的,但是如果您想避免使用较旧的reshape2
包,则可以使用较新的tidyverse
进行等效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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.