使用“by”R函数生成的多个图组合在一个图

时间:2018-04-03 16:45:34

标签: r plot grouping

我有一个包含多个数字列的数据框和一个包含不同因子的列。我想通过因子生成一个包含数字列图的唯一图像。我尝试了以下方法:

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,但每个因素都有一个页面。

相反,我想得到类似的东西(没有红线):

figure

2 个答案:

答案 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())

faceted boxplot

基础R

因为你无法嵌套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杜松子酒,主要是为了在这里缩小组合图。不需要生产。)

base R boxplots

答案 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的两部分