gpt4 book ai didi

r - 如何添加微型绘图并并排重复多个绘图?

转载 作者:行者123 更新时间:2023-12-05 05:00:32 25 4
gpt4 key购买 nike

有一个 nice answer around 在一个地 block 内绘制一个微型地 block 。我将它包装在一个函数中,该函数适用于单个绘图。

myPlot <- function(x, y) {
# main plot
plot(x)
# calculate position of inset
pp <- par("plt")
x0 <- pp[2] - (pp[2] - pp[1]) * 0.225
x1 <- pp[2] - .01
y0 <- pp[4] - (pp[4] - pp[3]) * 0.225
y1 <- pp[4] - .01
# set position for inset
op <- par(fig=c(x0, x1, y0, y1), mar=c(0, 0, 0, 0), new=TRUE)
# add inset grey background
plot.new()
u <- par("usr")
rect(u[1], u[2], u[4], u[3], col="grey80")
# add inset
par(new=TRUE)
plot(y, col=2)
par(op)
}

myPlot(x, y)

enter image description here

但是,当我使用 Map遍历多个数据列表,为了并排制作这种类型的多个图,par 似乎一团糟秒。微缩模型作为一个新情节出现,而不是在主要情节中。一次迭代后还会打开一个新设备(即旧图被覆盖)。

op1 <- par(mfrow=c(1, 2))
Map(function(x, y) myPlot(x, y), list(d0, d0), list(d0_inset, d0_inset))
par(op1)

enter image description here

当我使用 Map(function(x, y) myPlot(x, y), list(d0, d0), list(d0_inset, d0_inset)) 时不过,单独来看,(RStudio 的)绘图队列中有两个完美的绘图。因此 plot.new()par(new=TRUE)可能不是这里的问题。

我真正想要的是:

enter image description here

myPlot()在使用 Map 时,应根据数据列表的长度抛出一些带有缩图的主图。并将其装入 par(mfrow=...) .

有没有人知道如何使用基本 R 功能解决这个问题?


数据:

x <- data.frame(x = rnorm(150, sd=5), y = rnorm(150, sd=5))
y <- data.frame(x = rnorm(1500, sd=5), y = rnorm(1500, sd=5))

最佳答案

Jay 这里有几点。第一个是,如果你想继续使用 mfrow 那么最好不要使用 par(fig = x) 来控制你的绘图位置,因为 fig 会根据 mfrow 进行更改,并且还会强制生成一个新图(尽管您可以根据您的问题覆盖它)。您可以改用 plt,这使得所有坐标都相对于 fig 坐标中的空间。

第二点是您可以在不调用 plot.new()

的情况下绘制矩形

第三点,也许也是最重要的一点,你只需要写两次 par:一次是将 plt 更改为新的绘图坐标(包括一个new = TRUE 将其绘制在同一窗口中)并重置一次 plt(因为 new 将自行重置)。这意味着该函数运行良好,并且 par 保持原样。

请注意,我添加了一个参数 at,它允许您在较大的绘图中指定小绘图的位置和大小。它使用标准化坐标,因此例如 c(0, 0.5, 0, 0.5) 将是绘图区域的左下四分之一。我已将其设置为默认值,位于您的版本位置附近。

myPlot <- function(x, y, at = c(0.7, 0.95, 0.7, 0.95)) 
{
# Helper function to simplify co-ordinate conversions
space_convert <- function(vec1, vec2)
{
vec1[1:2] <- vec1[1:2] * diff(vec2)[1] + vec2[1]
vec1[3:4] <- vec1[3:4] * diff(vec2)[3] + vec2[3]
vec1
}

# Main plot
plot(x)

# Gray rectangle
u <- space_convert(at, par("usr"))
rect(u[1], u[3], u[2], u[4], col="grey80")

# Only write to par once for drawing insert plot: change back afterwards
plt <- par("plt")
plt_space <- space_convert(at, plt)
par(plt = plt_space, new = TRUE)
plot(y, col = 2)
par(plt = plt)
}

所以我们可以测试它:

x <- data.frame(x = rnorm(150, sd = 5), y = rnorm(150, sd = 5))
y <- data.frame(x = rnorm(1500, sd = 5), y = rnorm(1500, sd = 5))

myPlot(x, y)

enter image description here

par(mfrow = c(1, 2))
myPlot(x, y)
myPlot(x, y)

enter image description here

par(mfrow = c(2, 2))
for(i in 1:4) myPlot(x, y)

enter image description here

关于r - 如何添加微型绘图并并排重复多个绘图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63086207/

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