gpt4 book ai didi

r - 将多个对齐的绘图放置在一页上时避免浪费空间

转载 作者:行者123 更新时间:2023-12-02 10:57:25 25 4
gpt4 key购买 nike

我想将四个图放在一个页面上。轴标签应仅打印在最边缘,即仅用于底部图表的 x 轴标签,仅用于左侧图表的 y 轴标签。这既适用于整个轴的名称,也适用于各个刻度线。我可以使用以下代码生成一些内容:

pdf(file = "ExampleOutput.pdf",
width = 6.61,
height = 6.61,
pointsize = 10
)
set.seed(42)
catA <- factor(c("m100", "m500", "m1000", "m2000", "m3000", "m5000"))
catB <- factor(20:28)
samples <- 100
rsample <- function(v) v[ceiling(runif(samples, max=length(v)))]
Tab <- data.frame(catA = rsample(catA),
catB = rsample(catB),
valA = rnorm(samples, 150, 8),
valB = pmin(1,pmax(0,rnorm(samples, 0.5, 0.3))))
par(mfrow = c(2,2))
for (i in 0:3) {
x <- Tab[[1 + i %% 2]]
plot(x, Tab[[3 + i %/% 2]],
xlab = if (i %/% 2 == 1) "Some Categories" else NULL,
ylab = if (i %% 2 == 0) "Some Values" else NULL,
axes = FALSE
)
axis(side = 1,
at=1:nlevels(x),
labels = if (i %/% 2 == 1) levels(x) else FALSE)
axis(side = 2, labels = (i %% 2 == 0))
box(which = "plot", bty = "l")
}
par(mfrow = c(1,1))
dev.off()

我欢迎有关如何改进绘图命令的建议,也许可以避免手动排空左下角的轴和 L。但这只是一个补充。

该序列的结果如下所示:

Current output

这里的问题是大量的空白被浪费。我的印象是,R 为轴和刻度标签保留了空间,即使它们没有被使用。由于浪费了空间,对于左下图,实际上只有每秒 x 刻度才会被标记,这在这里非常糟糕。

我想生成一个类似的图,但没有那么多空白。实际的图应该具有相同的大小,因此它们可以正确排列,但标签的空间应该仅位于外部。我想象这样的布局(在 GIMP 中创建的模型):

Desired output

如何实现这样的布局?

最佳答案

这里是对您显示的一般图的轻微修改,假设 y 和 x 轴标签属于所有图。它使用外边距来包含轴标签,我们使用参数 outer = TRUE 通过 title() 添加轴标签。效果有点像 ggplot2格子 图中的标签。

这里的关键是:

op <- par(mfrow = c(2,2),
oma = c(5,4,0,0) + 0.1,
mar = c(0,0,1,1) + 0.1)

它设置绘图参数(调用之前的值存储在op中)。我们在 1 边和 2 边上使用 54 线作为外边距,这是 mar 参数的常用数字。将各 1 行的绘图区域边距 (mar) 添加到顶部和右侧,以便在绘图之间留出一点空间。

轴标签添加在 for() 循环之后

title(xlab = "Some Categories",
ylab = "Some Values",
outer = TRUE, line = 3)

整个脚本是:

set.seed(42)
catA <- factor(c("m100", "m500", "m1000", "m2000", "m3000", "m5000"))
catB <- factor(20:28)
samples <- 100
rsample <- function(v) v[ceiling(runif(samples, max=length(v)))]
Tab <- data.frame(catA = rsample(catA),
catB = rsample(catB),
valA = rnorm(samples, 150, 8),
valB = pmin(1,pmax(0,rnorm(samples, 0.5, 0.3))))
op <- par(mfrow = c(2,2),
oma = c(5,4,0,0) + 0.1,
mar = c(0,0,1,1) + 0.1)
for (i in 0:3) {
x <- Tab[[1 + i %% 2]]
plot(x, Tab[[3 + i %/% 2]], axes = FALSE)
axis(side = 1,
at=1:nlevels(x),
labels = if (i %/% 2 == 1) levels(x) else FALSE)
axis(side = 2, labels = (i %% 2 == 0))
box(which = "plot", bty = "l")
}
title(xlab = "Some Categories",
ylab = "Some Values",
outer = TRUE, line = 3)
par(op)

产生

enter image description here

关于r - 将多个对齐的绘图放置在一页上时避免浪费空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13239986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com