我有一个包含多个数字列的数据框和一个包含不同因子的列。我想通过因子生成一个包含数字列图的唯一图像。我尝试了以下方法:
varA <- runif(40)
varB <- runif(40)
varB <- runif(40)
varC <- runif(40)
mainVar <- c(rep('cat', 10), rep('dof', 10), rep('mouse', 10), rep('frog', 10))
plotData <- data.frame(varA, varB, varC, mainVar)
pdf('asd.pdf')
par(mfrow=c(2,2))
by(plotData, plotData$mainVar, function(x){
par(mfrow=c(1,3))
boxplot(x$varA)
boxplot(x$varB)
boxplot(x$varC)
})
dev.off()
它会产生一个独特的pdf,但每个因素都有一个页面。
相反,我想得到类似的东西(没有红线):
答案 0 :(得分:3)
首先,这里显示的两种技术都更喜欢“高”和“高”中的数据。格式。有几种工具可以为您重塑它,我将使用
# library(tidyr)
plotDataTall <- tidyr::gather(plotData, k, v, -mainVar)
head(plotDataTall)
# mainVar k v
# 1 cat varA 0.4023846
# 2 cat varA 0.3406813
# 3 cat varA 0.7990530
# 4 cat varA 0.3706167
# 5 cat varA 0.5986029
# 6 cat varA 0.1626782
其他工具包括reshape2
包或统计数据功能reshape
,这两种工具对初次使用的用户越来越不直观。
ggplot2
library(ggplot2)
ggplot(plotDataTall, aes(x = k, y = v)) +
geom_boxplot() +
facet_wrap(~ mainVar, nrow=2) +
theme(axis.title.x = element_blank(),
axis.title.y = element_blank())
因为你无法嵌套par(mfrow=...)
的使用(它们替换而不是嵌套),你可以坚持使用过度拱形2x2并处理boxplot中的每变量箱图。这可以使用广泛的数据:
par(mfrow=c(2,2), mar=c(4,3,3,0.1))
ign <- by(plotData, plotData$mainVar, function(x) {
boxplot(x$varA, x$varB, x$varC, main=x$mainVar[1])
})
或高格式:
par(mfrow=c(2,2), mar=c(4,3,3,0.1))
ign <- by(plotDataTall, plotDataTall$mainVar, function(x) {
boxplot(v~k, data=x, main=x$mainVar[1])
})
(我冒昧地调整mar
杜松子酒,主要是为了在这里缩小组合图。不需要生产。)
答案 1 :(得分:0)
正如r2evans已经指出的那样,我怀疑基本情节函数是否可行。使用ggplot2(tidyverse的一部分),您可以使用以下方法获得单页图:
library(tidyverse)
plotData %>%
gather(var, y, -mainVar) %>%
ggplot(aes(x = var, y = y)) + geom_boxplot() + facet_wrap(~mainVar)
请注意,这也使用管道运算符(dplyr),并收集(tidyr)tidyverse的两部分