ggplot boxplot 多列带有条件的因素
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
我想创建一个单独的箱线图来显示每列 "total" 的分布: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 function/method 让我一次完成我的情节。不要认为我可以使用 melt() 因为 Total 列。提前致谢。
已编辑:显然,我 should/can 使用 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
:
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)
示例数据框:
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
我想创建一个单独的箱线图来显示每列 "total" 的分布: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 function/method 让我一次完成我的情节。不要认为我可以使用 melt() 因为 Total 列。提前致谢。
已编辑:显然,我 should/can 使用 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
:
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)