【问题标题】:Combine multiple plots, generated using the "by" R function, in one figure将使用“by”R 函数生成的多个图组合在一个图中
【发布时间】:2018-04-03 16:45:34
【问题描述】:

我有一个数据框,其中包含多个数字列和一个具有不同因子的列。我想按因子生成一个包含数字列图的独特图像。我尝试了以下方法:

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

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

【问题讨论】:

  • 你不能这样嵌套par(mar=...)。您可能需要做更多的手动工作,可能使用layout 或使用ggplot2facet_* 函数。
  • 正如 Gregor 指出的那样,它的本意是“你不能嵌套par(mfrow=...)

标签: r plot grouping


【解决方案1】:

首先,此处显示的两种技术都更喜欢“高”格式的数据。有几个工具可以为你重塑它,我会用

# 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())

基础 R

因为您不能嵌套使用 par(mfrow=...)(它们替换,而不是嵌套),您可以坚持使用过度拱形 2x2 并在箱线图中处理每个变量的箱线图。这可以是宽数据:

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])
})

(我冒昧调整了margins,主要是为了缩小此处的组合情节。生产不需要。)

【讨论】:

  • @Gregor,对不起,但我不明白。我正确使用了mfrowmar,并说明了为什么我更改了边距。如果您建议 mar= 是不必要的,我完全同意......并这样评论。我还有什么遗漏的吗?
  • 哦,当然,我看到了错字。谢谢。 (也许是 gsub 中的 g 让我感到震惊...... *耸耸肩*)
  • 那会为我做的。现在讨论。感谢 Gregor 的 QA。
【解决方案2】:

正如 r2evans 已经指出的那样,我怀疑使用基本绘图功能是否可行。使用 ggplot2(tidyverse 的一部分),您可以使用以下方法获得一页图:

library(tidyverse)
plotData %>% 
gather(var, y, -mainVar) %>% 
ggplot(aes(x = var, y = y)) + geom_boxplot() + facet_wrap(~mainVar)

请注意,这也使用管道运算符 (dplyr) 和收集 (tidyr) 两个部分的 tidyverse

【讨论】:

    猜你喜欢
    • 2018-09-27
    • 1970-01-01
    • 2017-03-03
    • 2021-09-22
    • 2015-02-14
    • 2019-11-14
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多