我正在尝试创建一个包含坐标,密度和凸包多边形的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代码中的颜色时,它是否会改变情节呢?
答案 0 :(得分:12)
您的问题出在ddply
上:目前您的代码按照Latitude
和Longitude
的不同值(即您正在绘制的每个点)拆分数据,找到凸包每个拆分(这只是点本身)并将结果绑定在一起,实际上只为您的数据中的每个点提供一行。这就是你绘制的多边形触及每个点的原因。
这是一个应该有效的解决方案:
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}}