【问题标题】:R ggplot2 stat_density2d gridR ggplot2 stat_density2d 网格
【发布时间】:2013-09-17 15:32:14
【问题描述】:

在 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

这会产生以下内容:

那么我怎样才能将网格更改为由三角形绑定。而不是原始的笛卡尔绘图边界?

【问题讨论】:

  • 只向密度层提供三角形内的点...?如果没有可使用的示例,则无能为力。
  • 我会整理一些 MWE 来演示。
  • 不是您确切问题的答案,但您查看过ternvis package 吗?我猜这样会更方便。
  • @nograpes,谢谢,但我想坚持使用 ggplot2,以确保我所有工作的一致性......
  • 好吧,也许您会对this page 感兴趣,它在ggplot2 中描述了一种解决方案。

标签: r ggplot2


【解决方案1】:

自从发布了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()

【讨论】:

    【解决方案2】:

    这将是一个有点粗略的选择,这里只是部分展示:

    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")
    

    还有一些其他想法你可能会调查herehere,尽管我认为它们可能涉及删除 ggplot2。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 2014-09-10
      • 2015-05-16
      • 2018-09-21
      • 1970-01-01
      • 2017-11-28
      相关资源
      最近更新 更多