如何在ggplot2中的散点图区域周围绘制整洁的多边形


32

如何在散点图上的一组点周围添加整洁的多边形?我正在使用ggplot2,但对的结果感到失望geom_polygon

数据集在该处,作为制表符分隔的文本文件。下图显示了一些国家/地区对健康和失业态度的两种衡量标准:

密度为2d的散点图

我想从geom_density2d花哨的少,但从经验上更正确geom_polygon。未排序数据的结果无济于事:

在此处输入图片说明

如何在最小-最大yx值周围绘制充当轮廓路径的“整洁”多边形?我尝试对数据进行排序无济于事。

码:

print(fig2 <- ggplot(d, aes(man, eff, colour=issue, fill=issue)) + 
geom_point() + geom_density2d(alpha=.5) + labs(x = "Efficiency", y = "Mandate"))

d目的是通过获得该CSV文件

解:

感谢WayneAndy W和其他人的指导!数据,代码和图形已发布到GitHub上。结果看起来像这样:

结果


6
您可能要寻找的术语是点的凸包(或可能的alpha包)。您应该能够找到R函数来计算这些值,然后将它们作为图层添加到绘图中。
Andy W

感谢您指出正确的术语!我已经无法使用?chullggplot2至今。我不确定我的编码是否正确,并希望有人已经做到了。
神父

您可以添加R代码来提问吗?
Yuriy Petrovskiy 2012年

需要注意的一件事:显示的是最大值,可能是“离群值”。我相信R包的alphahull工作方式类似于查找凸包,但允许您向内/向外调整它,以尝试执行置信区间之类的操作。
韦恩

@ Wayne,alpha船体不是置信区间(无论如何可以想象)。请参阅此gis.se问题,以获取简要说明和有关alpha船体的一些参考。也许您对双变量置信椭圆的想法,甚至是袋状图(用于识别异常值的双变量箱形图)。
安迪W

Answers:


33

通过一些谷歌搜索,我发现了Gota Morota的网站,她的网站上已经有一个例子。下面是将该示例扩展到您的数据的示例。

在此处输入图片说明

library(ggplot2)
work <- "E:\\Forum_Post_Stuff\\convex_hull_ggplot2"
setwd(work)

#note you have some missing data
mydata <- read.table(file = "emD71JT5.txt",header = TRUE, fill = TRUE)
nomissing <- na.omit(mydata) #chull function does not work with missing data

#getting the convex hull of each unique point set
df <- nomissing
find_hull <- function(df) df[chull(df$eff, df$man), ]
hulls <- ddply(df, "issue", find_hull)

plot <- ggplot(data = nomissing, aes(x = eff, y = man, colour=issue, fill = issue)) +
geom_point() + 
geom_polygon(data = hulls, alpha = 0.5) +
labs(x = "Efficiency", y = "Mandate")
plot

谢谢,我将相应地修改代码。不幸的是,您的图像文件似乎未在此处加载,但是代码已在此处。
神父

@神父 ,到底是什么问题?
安迪W

@AndyW不幸的是,该代码不支持缺少的值,并且我没有找到一种方法来对其进行调整。
神父

@Fr。,除了消除这些观察值之外,您还希望如何处理缺失的数据值?任何合理的估算技术都会导致这些点位于非缺失观测值的凸包内部
Andy W

@AndyW我的意思是NA杀死chull功能。我希望它只是忽略它,但是这样做失败了,并且我没有找到一种na.omit()使它起作用的方法。我确信这是有可能的,我只是不具备超越以前解决方案的黑客技能。
神父

8

如果我理解你的问题,你要找的凸包health和的unemployment。在R中可能有几个软件包可以执行此操作,其中一个是package geometry。我以为这些点是按周长排序的,但是您必须检查一下。

编辑:这是一个示例,它不使用ggplot,但我希望它是有用的。chull文档中的示例似乎是错误的,可能会使您失望:

X <- matrix(rnorm(2000), ncol = 2)
X.chull <- chull (X)
X.chull <- c(X.chull, X.chull[1])
plot (X)
lines (X[X.chull,])

编辑2:好,这是使用ggplot2的东西。我们转Xdata.frame与变量xy。然后:

library(ggplot2)
X <- as.data.frame(X)
hull <- chull(X)
hull <- c(hull, hull[1])
ggplot(X, aes(x=x, y=y)) + geom_polygon(data=X[hull,], fill="red") + geom_point()

请注意,在geom_point使用Xggplot中的data()和aes时,我在中覆盖了它geom_polygon

要完全使用它,您需要将两个问题的船体的x和y放入中bar,使用第三列issue来区分它们。


纠正有关凸包的问题。我曾尝试使用chull生成凸包,但无法将结果用于ggplot2
神父

@Fr .:我已经快速编辑了答案。看看是否能使您走上正确的道路。
韦恩

我可以看到它是如何独立工作的,但是我想知道如何通过获得最后一行ggplot2
神父

@Fr .:好的,现在怎么样?
韦恩

有效!谢谢。我必须添加na.omit以消除chull无法正常工作的NA 。再次感谢。
神父

5

截至今天下午,我已将该chull函数包装在R包中作为geom_convexhull函数。

加载包后,就可以将其用作其他任何geom,在您的情况下,它应类似于:

ggplot(d, aes(man, eff, colour=issue, fill=issue)) + 
  geom_convexhull(alpha=.5) + 
  geom_point() + 
  labs(x = "Efficiency", y = "Mandate"))

该软件包可在github上找到:https : //github.com/cmartin/ggConvexHull


非常感谢!当我尝试对chull分组因子应用直到发现这一点时,我从不希望的输出中感到沮丧。
jogall
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.