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 个变量的成对比较?的主要内容,如果未能解决你的问题,请参考以下文章
如何网格化面板图,使其在 R 中的 ggplot 中具有分类变量和不同的 x 变量