将凸包添加到ggplot map

时间:2018-02-08 16:52:08

标签: r

我正在尝试创建一个包含坐标,密度和凸包多边形的ggplot。

数据是一组二十个纬度和纵向点。

这是我的代码:

# Data

economy <- read.csv("data-economy.csv", header=TRUE)

# Convex hulls.

hulls <- ddply(economy, .(Latitude, Longitude), function(economy) 
            economy[chull(economy$Latitude, economy$Longitude), ])

fig <- ggplot(economy, aes(Latitude, Longitude, colour="black", fill="black")) + 
              geom_point() + 
              geom_density2d(alpha=.5) + 
              labs(x = "Latitude", y = "Longitude") + 
              geom_polygon(data=hulls, alpha=.2)

fig

结果情节如下所示:

economypolygon1

我尝试了一些东西,但是我不能让凸包只包含最大纬度和经度的点。我可以使用以下代码在ggplot之外获得我想要的形状:

X <- economy
chull(X)
plot(X, cex = 0.5)
hpts <- chull(X)
hpts <- c(hpts, hpts[1])
lines(X[hpts, ])

它给我的结果是:

economypolygon2

如何在ggplot中获得与R base相同的形状?

另外,为什么当我改变ggplot代码中的颜色时,它是否会改变情节呢?

1 个答案:

答案 0 :(得分:12)

您的问题出在ddply上:目前您的代码按照LatitudeLongitude的不同值(即您正在绘制的每个点)拆分数据,找到凸包每个拆分(这只是点本身)并将结果绑定在一起,实际上只为您的数据中的每个点提供一行。这就是你绘制的多边形触及每个点的原因。

这是一个应该有效的解决方案:

library(tidyverse)

# Find the convex hull of the points being plotted
hull <- mtcars %>%
  slice(chull(mpg, wt))

# Define the scatterplot
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point(shape = 21)

# Overlay the convex hull
p + geom_polygon(data = hull, alpha = 0.5)

现在,如果您想为图表添加分组,您只需为分组变量的每个级别计算chull

# Calculate the hulls for each group
hull_cyl <- mtcars %>%
  group_by(cyl) %>%
  slice(chull(mpg, wt))

# Update the plot with a fill group, and overlay the new hulls
p + aes(fill = factor(cyl)) + geom_polygon(data = hull_cyl, alpha = 0.5)

reprex package(v0.2.0)创建于2018-02-12。

顺便说一句,在其中一个ggplot2小插图中也有一个很好的例子,他们通过逐步指导来创建自定义统计数据和地理位置,使用凸包作为示例:{ {3}}