R - 如何在 25 x 4 网格而不是 10 x 10 网格中绘制 10 个变量的成对比较?

Posted

技术标签:

【中文标题】R - 如何在 25 x 4 网格而不是 10 x 10 网格中绘制 10 个变量的成对比较?【英文标题】:R -- how to plot pairwise comparisons for 10 variables in a 25 x 4 grid instead of a 10 x 10 grid? 【发布时间】:2019-12-09 04:52:55 【问题描述】:

我有 10 个变量,我想在 R 中将它们相互绘制。如果我有更少,我可以这样做

pairs(data)

但不幸的是,当我这样做时,我得到的地块非常小。我看过这个问题。

Change plot size of pairs plot in R

我不认为 OP 正在寻求同样的东西。如果我理解正确,他想放大绘图,以便当他在 PDF 中放大绘图时,图像的绘制空间更大。

但是,我需要写一份报告,我想完全取消 10x10 网格(除非有人有更好的主意)。在成对比较网格中,通常有一个巨大的网格,其中网格中的每个单元格都是一个图。但显然对于大量变量,这很难查看。对于 10x10,这太小了。我想要一种绘图方法,它允许我自动生成所有成对比较,然后以更合理的格式打印出来。因此,对于 10 个变量,可能是 25 x 4 的网格,以便可以在多个页面上轻松查看图表。

在 ggplot2 中是否有一种简单的方法可以做到这一点?如果没有,还有哪些替代方案?

这是一个例子:

library(Matrix)
library(mvtnorm)
set.seed(42)
n <- 1000
sig <- matrix(rexp(100, rate=.1), ncol=10)
sig <- matrix(forceSymmetric(sig), ncol=10)
X <- rmvnorm(n, mean=rep(0,10), sigma=sig, method="svd")
pairs(X)

产生

【问题讨论】:

你能把它设为minimal reproducible example吗?没有您尝试更改的数据、大量代码或输出 你真的需要全部 100 个地块吗?其中 10 个是针对自身的变量,没有提供信息,45 个是反射(为相同的变量切换 x 和 y 轴)。所有信息都包含在 45 个图中(例如 9 x 5)。 @camille 我提供了一个最小的可重现示例 @dcarlson 不,我不需要反射或变量本身。如果有办法在没有这些的情况下做到这一点,那就足够了。 【参考方案1】:

假设您的数据集是df。你可以通过三个步骤做你想做的事:

library(tidyverse)

# create all combinations of different variable names
nms <- list(x = names(df), 
            y = names(df)) %>% 
  cross_df() %>% 
  filter(x != y)

# create list of all the scatter plots
plts <- map2(.x = nms$x, 
             .y = nms$y,
          ~ggplot(data = df, 
                   aes_string(x = .x, 
                              y = .y)) +
              geom_point()
          )

# create multi-page pdf with the figures
ggsave("longplot.pdf", 
       gridExtra::marrangeGrob(grobs = plts, 
                               nrow = 5, 
                               ncol = 2),
       device = "pdf", 
       width = 210, 
       height = 297, 
       units = "mm")

【讨论】:

【参考方案2】:

这是一种使用基本图形的方法。首先创建一个地块列表:

plts <- expand.grid(1:10, 1:10)
plts <- as.matrix(plts[plts$Var2 < plts$Var1, ])

为一组 9 x 5 的 45 个地块设置比例。删除网格线/标签,因为您只想查看整体模式:

dev.new(width=8, height=12)
oldp <- par(mfcol=c(9, 5), mar=c(1, 1, 1, 1))
for (i in seq_len(dim(plts)[1])) 
     plot(X[, plts[i, ]], pch=20, cex=.5, xlab="", ylab="", axes=FALSE, frame=TRUE)
     title(xlab=paste("col", plts[i, 1]), ylab=paste("col", plts[i, 2]), line=0)

par(oldp)

【讨论】:

以上是关于R - 如何在 25 x 4 网格而不是 10 x 10 网格中绘制 10 个变量的成对比较?的主要内容,如果未能解决你的问题,请参考以下文章

Octave没有绘制函数

R:如何用点“填充”网格

如何网格化面板图,使其在 R 中的 ggplot 中具有分类变量和不同的 x 变量

由于本地存储代理,Extjs 网格面板最多显示 25 行。如何更改此限制值?

R中的()和[]有啥区别[关闭]

ExtJS 4.0.x:在弹出视图中编辑网格