在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不同?有没有解决的办法? {注意:我更感兴趣的是理解为什么正在发生这种情况,而不是解决方法。]
答案 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
中单独执行每个方面的评估 - 我能想到的唯一应用是方面的聚合,并且有很多方法可以轻松实现这一点。另外,为了避免上面所示的过度绘图,你必须建立一个包含四个观察结果的表格(每个文本一个)。使您的代码更简单。