gpt4 book ai didi

r - 将凸包添加到ggplot map

转载 作者:行者123 更新时间:2023-12-04 10:06:49 25 4
gpt4 key购买 nike

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

数据是一组 20 个纬度和经度点。

这是我的代码:

# 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 基础相同的形状?

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

最佳答案

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

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

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)



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

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

关于r - 将凸包添加到ggplot map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48690755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com