(ggplot)facet_grid隐式子集在geom_text中没有被尊重(?)

时间:2013-11-18 22:02:53

标签: r ggplot2

geom_text(...)中,默认数据集有时仅基于构面变量进行子集化。最简单的解释一个例子。

这个例子试图用ggplot模拟对(...)(是的,我知道格子,plotmatrix和ggpairs - 关键是理解 ggplot如何工作)。

require(data.table)
require(reshape2)     # for melt(…)
require(plyr)         # for .(…)
require(ggplot2)

从mtcars中提取mgp,hp,disp和wt,使用cyl作为分组因子

xx <- data.table(mtcars)
xx <- data.table(id=rownames(mtcars),xx[,list(group=cyl, mpg, hp, disp, wt)])

重塑以便我们可以使用ggplot facets。

yy <- melt(xx,id=1:2, variable.name="H", value.name="xval")
yy <- data.table(yy,key="id,group")
ww <- yy[,list(V=H,yval=xval), key="id,group"]
zz <- yy[ww,allow.cartesian=T]

在zz,

H: facet variable for horizontal direction
V: facet variable for vertical direction
xval: x-value for a given facet (given value of H and V)
yval: y-value for a given facet

现在,以下内容会生成接近pairs(…)

的内容
ggp <- ggplot(zz, aes(x=xval, y=yval))
ggp <- ggp + geom_point(subset =.(H!=V), size=3, shape=1)
ggp <- ggp + facet_grid(V~H, scales="free")
ggp <- ggp + labs(x="",y="")
ggp

[]

换句话说,geom_point中使用的xvar和yvar的值适用于每个方面;它们已经根据H和V的值进行了子集化。但是,添加以下内容将变量名称置于对角线方面的中心位置:

ggp + geom_text(subset = .(H==V),aes(label=factor(H), 
                                     x=min(xval)+0.5*diff(range(xval)),
                                     y=min(yval)+0.5*diff(range(yval))), 
                                 size=10)

给出了这个:

看来H已经为每个方面正确地进行了子集化(例如标签是正确的),但xvar和yvar似乎适用于整个数据集zz,而不是适用于每个方面对应于H和V的子集。

我的问题是:在上面,为什么xvar和yvar的处理方式与H中的H不同?有没有解决的办法? {注意:我更感兴趣的是理解为什么正在发生这种情况,而不是解决方法。]

1 个答案:

答案 0 :(得分:0)

一个观察结果是标签实际上是过度绘制的:

ggp + geom_text(subset = .(H==V), aes(label=factor(H),
                                     x=min(xval)+0.5*diff(range(xval)) 
                                       + runif(length(xval), max=10),
                                     y=min(yval)+0.5*diff(range(yval))
                                       + runif(length(yval), max=20)), size=10)

为标签的位置添加了一些噪音,您可以看到zz中的每个观察都添加了一个文字。

对于你原来的问题:从ggplot的角度来看,一次评估所有美学可能会更快,并且可以更快地分割为分面,这会导致观察到的行为。我不确定是否会在ggplot中单独执行每个方面的评估 - 我能想到的唯一应用是方面的聚合,并且有很多方法可以轻松实现这一点。另外,为了避免上面所示的过度绘图,你必须建立一个包含四个观察结果的表格(每个文本一个)。使您的代码更简单。