gpt4 book ai didi

r - R中的嵌套布局

转载 作者:行者123 更新时间:2023-12-04 20:40:38 25 4
gpt4 key购买 nike

我想制作一个由多个图组成的图,例如一个 5x2 网格,每个单元格中有三个图。更准确地说,我需要的不仅仅是一个数字,而是找到一种在单个图中多次使用我的绘图功能的方法。

我编写了一个函数,它使用布局来堆叠绘图,外边距有一个公共(public)轴。我实际上需要它用于 TraMineR 包中的 seqIplot 和 seqdplot 函数,但据我所知,问题与这些无关,所以这是一个带有 barplot 的最小工作示例。

stackedplot <- function(data){
layout(matrix(c(1:3), nrow=3))
par(mar=c(0,0,0,0), oma=c(4,1,1,1), mgp=c(3,0.5,0), cex=1)
barplot(data[[1]], axes=F, xlab="", ylab="", horiz=TRUE)
barplot(data[[2]], axes=F, xlab="", ylab="", horiz=TRUE)
barplot(data[[3]], axes=F, xlab="", ylab="", horiz=TRUE)
axis(1, at=c(0:10)/10, outer=TRUE)
mtext("Label", line=2, side=1)
}
stackedplot(list(1:10, 10:1, rep(1,10)))

我想做的是再次使用类似布局的东西,并使用stackedplot作为布局的网格,即这样的东西(当然,这不起作用):
layout(matrix(c(1:2), nrow=1))
stackedplot(list(1:10, 10:1, rep(1,10)))
stackedplot(list(rep(1,10), 1:10, 10:1))

我试过 split.screen,但没有成功:
split.screen(c(1,2))
screen(1)
stackedplot(list(1:10, 10:1, rep(1,10)))
screen(2)
stackedplot(list(rep(1,10), 1:10, 10:1))
close.screen(all = TRUE)

我也试过 grid 包,但显然它与基本图形不兼容。
grid.newpage()
pushViewport(viewport(x=0, y=0, width=0.5, height=1,
default.units="native"))
print(stackedplot(list(1:10, 10:1, rep(1,10))), newpage=FALSE)
pushViewport(viewport(x=0.5, y=0, width=0.5, height=1,
default.units="native"))
print(stackedplot(list(rep(1,10), 1:10, 10:1)), newpage=FALSE)

最佳答案

经过更多的研究和一些帮助,我现在正在回答我自己的问题,以防它对其他人有用。

可以使用 grid 创建嵌套布局。包,可用于使用 gridBase 的基本图形包裹。堆叠图的函数编写如下。

library(grid)
library(gridBase)

stackedplot <- function(data, main=""){

top.vp <- viewport(layout=grid.layout(nrow=5, ncol=1,
heights=unit(c(3, 1, 1, 1, 5),
c("lines", "null", "null", "null", "lines"))),
width=unit(0.9, "npc"))

title <- viewport(layout.pos.row=1, layout.pos.col=1, name="title")
p1 <- viewport(layout.pos.row=2, layout.pos.col=1, name="plot1")
p2 <- viewport(layout.pos.row=3, layout.pos.col=1, name="plot2")
p3 <- viewport(layout.pos.row=4, layout.pos.col=1, name="plot3")
xaxis <- viewport(layout.pos.row=5, layout.pos.col=1, name="xaxis")

splot <- vpTree(top.vp, vpList(title, p1, p2, p3, xaxis)) # Defining the hierarchy of the viewports
pushViewport(splot) # Creating viewports for plotting with the definitions of splot

upViewport() # Navigating up in the viewport tree
downViewport("plot1") # Navigating down in the viewport tree, searching for viewport "plot1"
grid.rect() # Plotting a rectangle (borders for the viewport)
par(plt=gridPLT(), new=TRUE) # Taking the dimensions of the viewport for a base graphics plot
# Adding plot to an existing plot
barplot(data[[1]], axes=FALSE, xlab="", ylab="", horiz=TRUE)

upViewport()
downViewport("plot2")
grid.rect()
par(plt=gridPLT(), new=TRUE)
barplot(data[[2]], axes=FALSE, xlab="", ylab="", horiz=TRUE)

upViewport()
downViewport("plot3")
grid.rect()
par(plt=gridPLT(), new=TRUE)
barplot(data[[3]], xlab="", ylab="", horiz=TRUE)

upViewport()
downViewport("xaxis")
grid.text("X label", y = unit(2, "lines"))

upViewport()
downViewport("title")
grid.text(main, y = unit(1, "lines"))

upViewport(2)
}

该函数首先描述了一个视口(viewport)(窗口宽度的 90%),该视口(viewport)被划分为具有不同高度的 5x1 视口(viewport)网格。网格中的每个视口(viewport)都有一个名称,以后可以调用该名称。视口(viewport)树 (splot) 用 vpTree 描述它定义了视口(viewport)的层次结构。在描述了视口(viewport)之后,这些视口(viewport)实际上已准备好使用 pushViewport 进行绘图。 .

现在首先查找每个命名的视口(viewport),然后用 upViewport 打开进行绘图。 (在视口(viewport)树中向上)和 downViewport (它在视口(viewport)树中向下寻找请求的视口(viewport))。

对于绘制基本图形, gridPLT此处需要(也可以使用 gridFIGgridOMI,请参阅 gridBase 手册了解更多信息)。之后,可以使用任何基本图形函数绘制到当前视口(viewport)中。

在请求的地 block 之后, upViewport(2)用于导航回根(层次结构中向上的 2 个视口(viewport))。

现在可以在另一个网格中多次调用stackedplot函数,如下所示。
opar <- par(no.readonly=TRUE) # Saving graphical parameters
plot.new() # Needed for par(new=TRUE) in stackedplot()

multitop.vp <- viewport(layout=grid.layout(1,2), width = unit(0.95, "npc"))
pl1 <- viewport(layout.pos.col=1, layout.pos.row=1, name="A")
pl2 <- viewport(layout.pos.col=2, layout.pos.row=1, name="B")
vpall <- vpTree(multitop.vp, vpList(pl1,pl2))
pushViewport(vpall)

upViewport()
downViewport("A")
stackedplot(data=list(1:10,10:1,rep(10,10)),main="A")

upViewport()
downViewport("B")
stackedplot(data=list(10:1,rep(10,10),1:10),main="B")

upViewport(2)
par(opar) # Returning the graphical parameters saved earlier

enter image description here

关于r - R中的嵌套布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27015449/

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