【问题标题】:Adding convex hull to ggplot map将凸包添加到ggplot地图
【发布时间】:2018-07-19 08:00:58
【问题描述】:

我正在尝试创建一个包含坐标、密度和凸包多边形的 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

生成的图如下所示:

我尝试了一些方法,但无法让凸包仅包含最大纬度和经度的点。我可以使用以下代码在 ggplot 之外获得我想要的形状:

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

它给我的结果是这样的:

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

另外,为什么当我在我的 ggplot 代码中更改颜色时,它不会改变绘图?

【问题讨论】:

  • @Mikko Marttila 谢谢。我使用该问题中的代码来提出到目前为止的内容。我不明白为什么它不只使用我数据中的外部点 - 有什么想法吗?
  • 在您的ddply 调用中,您将通过LatitudeLongitude 的唯一值(即不同的点)拆分数据,并为每个点找到凸包,这就是点本身.
  • 试试hulls &lt;- economy[chull(economy$Latitude, economy$Longitude), ]
  • 链接的交叉验证帖子中的答案使用ddply 以便同时为多个组找到凸包;而在您的问题中,您只有一组要点可以找到解决方案,因此您不需要在这里ddply

标签: r


【解决方案1】:

您的问题在于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 年 2 月 12 日创建。

顺便说一句,ggplot2 小插图中还有一个很好的例子,他们通过分步指南创建自定义统计数据和几何图形,以凸包为例:https://cran.r-project.org/web/packages/ggplot2/vignettes/extending-ggplot2.html .

【讨论】:

    猜你喜欢
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    相关资源
    最近更新 更多