R ggplot2 stat_density2d grid

6
在R中的ggplot2中,我该如何将stat_density2d几何对象所使用的网格限制在三角形区域内?我正在绘制非标准ggplot2类型的三元图,轮廓线溢出了坐标轴。实际的三元图代码相当冗长,但本质上,我需要将轮廓线限制在等边三角形内。以下是可复现问题的示例代码:
library(ggplot2)

triangle <- data.frame(x=c(0,.5,1),y=c(0,1,0))
dummy <- data.frame(x=c(0.25,0.50,0.75),y=c(0.25,0.75,0.25))

p <- ggplot() + geom_polygon(data=triangle,aes(x,y),fill="transparent",color="black",size=1)
p <- p + geom_point(data=dummy,aes(x,y))
p <- p + stat_density2d(data=dummy,aes(x,y)) + theme_bw() +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), 
        panel.border = element_blank(), axis.ticks = element_blank(), 
        axis.text.x = element_blank(), axis.text.y = element_blank(),
        axis.title.x = element_blank(), axis.title.y = element_blank())
p

示例

我认为这是因为网格与绘图区域的原始笛卡尔坐标边界相关联,为了说明这一点,请考虑以下代码:

library(ggplot2)

triangle <- data.frame(x=c(0,.5,1),y=c(0,1,0))
dummy <- data.frame(x=c(0.25,0.50,0.75),y=c(0.25,0.75,0.25))

p <- ggplot() + geom_polygon(data=triangle,aes(x,y),fill="transparent",color="black",size=1)
p <- p + geom_point(data=dummy,aes(x,y))
p <- p + stat_density2d(data=dummy,aes(x,y),geom='tile',contour=F,fill="transparent",color="magenta") + theme_bw() +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), 
        panel.border = element_blank(), axis.ticks = element_blank(), 
        axis.text.x = element_blank(), axis.text.y = element_blank(),
        axis.title.x = element_blank(), axis.title.y = element_blank())
p

这将产生以下结果:

Sample2

那么我该如何更改网格以便受三角形限制,而不是原始的笛卡尔绘图边界?


只向密度层提供三角形内的点...?没有示例很难提供更多帮助。 - joran
虽然不是对你问题的确切回答,但你是否看过 ternvis 包?我猜它会更方便。 - nograpes
@nograpes,谢谢你的建议,但我想坚持使用ggplot2,以保持我的所有工作的一致性... - Nicholas Hamilton
我已扩展了那段代码的很多部分,它是我使用的原始来源,但仍无法解决能否使用stat_density2d的问题。 - Nicholas Hamilton
解决了。最终我使用了stat_contour。在对象创建完成后,我使用sp包中的point.in.polygon命令将所有位于三角形周边以外的点的网格值设置为“0”。 - Nicholas Hamilton
显示剩余2条评论
2个回答

5
自从发布ggtern包后,现在可以通过以下简单的代码实现以下结果:
#load the library
library(ggtern)

#Create dummy data
df <- data.frame(T=c(.8,.1,.1),
                 L=c(.1,.8,.1),
                 R=c(.1,.1,.8))

#Now plot the diagram
ggtern(data=df,aes(y=T,x=L,z=R)) + geom_point() + geom_density2d() + theme_bw()

enter image description here


1
这是一个比较粗糙的选项,只有部分在此处展示:
d1 <- data.frame(x = c(0,0.5,0),y = c(0,1,1))
p + geom_polygon(data = d1,aes(x = x,y = y),fill = "white",colour = "black")

你可能需要调查一些其他的想法,这里这里,虽然我认为它们可能涉及放弃ggplot2。

理论上,你可以使用grid.path来做一些花哨的事情,但困难在于(一如既往地)干净地在设备坐标系和绘图坐标系之间移动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接