【发布时间】:2013-07-27 18:32:30
【问题描述】:
我正在grid 中尝试我的第一步纯粹。作为练习,我想创建一个完全基于grid 的配对图(类似于pairs())。下面的函数myplotGrob 应该创建网格对象(grob;或gTree)并返回该对象。
我不确定
继续的最好方法是什么。应该使用哪些单位? (也试过"null")
frameGrob 是用来设置布局的吗? (这是我从 Paul Murrell 的书中了解到的)我如何选择/调整视口才能获得所需的情节(到目前为止,我只看到一团糟)布局是要预先设置的还是它最好只是逐步“连接”其他面板以获得 (4, 4) 绘图矩阵?
require(grid)
require(mvtnorm)
set.seed(271)
X <- rmvnorm(1000, mean=1:4, sigma=diag(4:1)) # goal: draw this in a pairs plot
## auxiliary function
panel <- function(x, y) pointsGrob(x=x, y=y, name="panel", gp=gpar(), vp=NULL)
## creates and returns a gTree (class)
myplotGrob <- function(X, name=NULL, gp=NULL, vp=NULL)
{
## x-axis grob
## y-axis grob
## ...
## set up layout
layout <- grid.layout(4, 4, # (4, 4) matrix
widths=rep(0.25, 4), heights=rep(0.25, 4),
default.units="npc")
## pushViewport(viewport(layout=layout)) # required???
all <- frameGrob(layout=layout) # produces a gTree without children
for(i in 1:4) {
for(j in 1:4) {
## group grobs together
gt <- gTree(X,
children=gList(panel(X[,i], X[,j])),
name=name, gp=gp, vp=vp, cl="myplotGrob")
all <- placeGrob(all, gt, row=i, col=j)
}
}
all
}
## draw the gTree
grid.myplot <- function(...) grid.draw(myplotGrob(...))
## call
grid.myplot(X)
更新
正如所要求的,这是我想到的原始问题的设计/布局(以上只是一个最小/学习示例)。以厘米为单位的单位只适合我(它们最终应该是“相对的”)。当然,面板的数量可能会有所不同。我希望所有部分都是网格对象,以便创建图形的函数将返回一个对象(不打印/绘图)。这样,每个部分都可以在之后进行修改。图形应显示维度为 5(或更小)的数组的结果:一个维度显示在行面板 [row.vars] 中,一个维度显示在列面板 [col.vars] 中,一个维度显示在每个面板的 x 轴上 [ xvar],每个面板可以包含 2 个不同维度的数组(因颜色和线型而异)[我在图中使用了d 和n]。如果当然,如果数组是四维的,那么上面设计的第 8 行应该是缺失的。我可以通过网格构建布局,但整个问题是如何从那里继续。这就是我想用上面的“最小示例”表达的内容。
【问题讨论】:
-
我的建议:不要使用 frameGrobs 和 co;它们非常慢,而且不是很有用。在我看来,gtable 包提供了一个更好的选择。
-
另外,你为什么要重新发明 lattice 和 ggplot2 已经做得很好的东西?你有什么特定的功能吗?
-
嗨巴蒂斯特,感谢您的帮助。是的,我们有(实际上是几个)新功能。理想情况下,我们不想依赖另一个包(
grid除外),这就是我们从头开始的原因(学习grid也很好,所以我们把它当作练习:-))。如果不使用frameGrobs(这是我从保罗的书中所理解的),我们还能使用什么?理想情况下,我只想看一个如何使用网格的最小(但有效)示例。 -
grid.multipanel()可以给你一些想法,我猜。除非您更准确地描述您希望在目标图中具有哪些功能(关于轴、面板之间的间距、图例、条带、多层数据……),否则很难给出有意义的答案。可以的话画一下有许多不同的方法来产生一个情节,想出一个最佳的设计并不是一件容易的事(这可能是每个绘图程序似乎都在重新发明轮子的原因)。 -
@baptiste 我不同意。 ggplot2 和 lattice 并不能解决每个人的问题,有些用户可能还想更深入地控制他们的图形。