ID <- 1:10
group <- c(1,1,1,2,2,2,3,3,3,3)
var1 <- c(6:15)
var2 <- c(7:16)
var3 <- c(6:11, NA, NA, NA, NA)
var4 <- c(4:9, NA, NA, NA, NA)
data <- data.frame(ID, group, var1, var2, var3, var4)
library(dplyr)
data %>% group_by(group) %>% boxplot(var1, var2)
最后一行不能按我的意愿行事。我们的想法是在一个图形中获得4个箱图。每个变量两个。也许我需要使用ggplot2?
答案 0 :(得分:8)
如果要在同一个图中同时获取两个变量,则需要重新组织数据。这是一个ggplot2
解决方案:
# load library
library(ggplot2)
library(tidyr)
library(ggthemes)
# reorganize data
df <- gather(data, "ID","group")
#rename columns
colnames(df) <- c("ID","group","var","value")
# plot
ggplot(data=df) +
geom_boxplot( aes(x=factor(group), y=value, fill=factor(var)), position=position_dodge(1)) +
scale_x_discrete(breaks=c(1, 2, 3), labels=c("A", "B", "C")) +
theme_minimal() +
scale_fill_grey()
制作宽度相同的箱形图是一个完全不同的问题(solution here),但是一个简单的替代方案就是这样:
# recode column `group` in the `data.frame`.
df <- transform(df, group = ifelse(group==1, 'A', ifelse(group==2, 'B', "C")))
# plot
ggplot(data=df) +
geom_boxplot( aes(x=factor(var), y=value, fill=factor((var))), position=position_dodge(1)) +
geom_jitter(aes(x=factor(var), y=value, color=factor((var)))) +
facet_grid(.~group, scales = "free_x") +
theme_minimal()+
scale_fill_grey() +
theme(axis.text.x=element_blank(),
axis.title.x=element_blank(),
axis.ticks=element_blank())
答案 1 :(得分:3)
您可以尝试首先融合数据框(在@lukeA的评论中提到)然后坚持基础图形。 ggplot2
或lattice
是其他不错的选择。
library(reshape2)
DF <- melt(data, id.vars = c("ID", "group"), measure.vars = c("var1", "var2"))
boxplot(value ~ group + variable, DF)
备用lattice
代码,也使用DF
:
bwplot(~ value | variable + group, data = DF)
备用ggplot2
代码,也使用DF
:
ggplot(DF, aes(x = factor(group), y = value, fill = variable)) + geom_boxplot()