如何从数据框向斯洛伐克的行政区域的多边形地图添加数据点?

时间:2019-07-11 08:19:17

标签: r plot geospatial polygon ggmap

请问这是一个基本的问题,这是我第一次在这里写信,在此先感谢。

我已经从Google Analytics(分析)中导出了经度,纬度和会话列的报告,我想将这些数据点添加到我在R中为斯洛伐克的行政区域创建的多边形地图中。

这就是我现在拥有的。

##Load the Raster Library
library(raster)

##Get the Province Shapefile for Slovakia
slovakia_level_1 <- getData('GADM', country='SVK', level=1)
slovakia_level_2 <- getData('GADM', country='SVK', level=2)

##Plot this shapefile
plot(slovakia_level_1)

library(ggmap)   ##load the ggmap package so we can access the crime data

## read our dataset with sessions from google analytics ( more on how to read excel files http://www.sthda.com/english/wiki/reading-data-from-excel-files-xls-xlsx-into-r)

library(readxl) ## this is the dataframe from google analytics and i would like to plot these data to the slovakia administrtaive region map
lugera <- read_excel("Analytics 01. [Lugera.sk] - [Reporting View] - [Filtered Data] New Custom Report 20190101-20190627.xlsx")

但是我真的不知道该如何继续。我是根据http://data-analytics.net/wp-content/uploads/2014/09/geo2.html这篇文章写的,但是当我需要绘制点时,我就卡住了。

这是来自Google Analytics(分析)报告的示例:

Longitude Latitude Sessions
17.1077 48.1486 25963
0.0000  0.0000  13366
21.2611 48.7164 4732
18.7408 49.2194 3154
21.2393 49.0018 2597
18.0335 48.8849 2462
19.1462 48.7363 2121
17.5833 48.3709 1918
18.0764 48.3061 1278
14.4378 50.0755 1099
20.2954 49.0511 715
18.1571 47.9882 663
18.6245 48.7745 653
17.8272 48.5918 620
18.9190 49.0617 542
19.1371 48.5762 464
-6.2603 53.3498 369
18.1700 48.5589 369
20.5637 48.9453 325
-0.1278 51.5074 284
21.9184 48.7557 258

当我努力弄清楚如何在多边形地图上绘制这些点时,有人可以帮助我从这里继续前进吗?

是否还可以在特定区域上创建热点图?

我希望这很清楚,但是如果没有,请告诉我,我会改善我的问题,这是我第一次问。

非常感谢您!

更新

我正在尝试重现Jay的回答,第一个带有红点的地图非常棒!谢谢!

但是在热图的情况下,我会出现错误,并且无法复制与得到多个错误时相同的图。

下面是我的代码的样子,我不确定问题出在哪里,因为我试图用与jay的答案相同的方式将数据框命名为ses

##Load the Raster Library

library(raster)  # imports library(sp)
slovakia_level_1 <- getData('GADM', country='SVK', level=1)


##Plot
plot(slovakia_level_1)
points(coordinates(slovakia_level_2), pch=20, col="red")

#ses is my google analytics dataframe where all 3 columns Longitude, Latitude and Sessions are numeric

## it is imported excel file to r and stored as a dataframe

ses

spdf <- SpatialPointsDataFrame(coords=ses[1:2], data=ses[3], 
                               proj4string=CRS(proj4string(slovakia_level_2)))
ppl.sum <- aggregate(x=spdf["Sessions"], by=slovakia_level_2, FUN=sum)
spplot(ppl.sum, "Sessions", main="Sessions in Slovakia")

这些是我得到的错误

spdf <- SpatialPointsDataFrame(coords=ses[1:2], data=ses[3], 
+                                proj4string=CRS(proj4string(slovakia_level_2)))
Error in proj4string(slovakia_level_2) : 
  object 'slovakia_level_2' not found
> ppl.sum <- aggregate(x=spdf["Sessions"], by=slovakia_level_2, FUN=sum)
Error in aggregate(x = spdf["Sessions"], by = slovakia_level_2, FUN = sum) : 
  object 'spdf' not found
> spplot(ppl.sum, "Sessions", main="Sessions in Slovakia")
Error in spplot(ppl.sum, "Sessions", main = "Sessions in Slovakia") : 
  object 'ppl.sum' not found

请多谢我对第一个问题的帮助,在此我不能表示我对StackOverflow所有人的尊重。

谢谢

2 个答案:

答案 0 :(得分:2)

实际上,coordinates()包中包含一个sp函数(从raster导入),我们可以轻松地将points添加到plot

library(raster)  # imports library(sp)
slovakia_level_1 <- getData('GADM', country='SVK', level=1)
slovakia_level_2 <- getData('GADM', country='SVK', level=2)

##Plot
plot(slovakia_level_1)
points(coordinates(slovakia_level_2), pch=20, col="red")

enter image description here

要使用您的Google Analytics(分析)数据(此处为ses)获得热图,我们可以使用spplot()(也包含在sp中)。首先,我们需要创建一个SpatialPointsDataFrame,根据this post on gis.stackexchange,我们将其聚合以匹配ses$Sessions中的slovakia_level_2个点和多边形。

spdf <- SpatialPointsDataFrame(coords=ses[1:2], data=ses[3], 
                               proj4string=CRS(proj4string(slovakia_level_2)))
ppl.sum <- aggregate(x=spdf["Sessions"], by=slovakia_level_2, FUN=sum)
spplot(ppl.sum, "Sessions", main="Sessions in Slovakia")

结果

enter image description here

数据

# your data from google analytics above
ses <- structure(list(Longitude = c(17.1077, 0, 21.2611, 18.7408, 21.2393, 
18.0335, 19.1462, 17.5833, 18.0764, 14.4378, 20.2954, 18.1571, 
18.6245, 17.8272, 18.919, 19.1371, -6.2603, 18.17, 20.5637, -0.1278, 
21.9184), Latitude = c(48.1486, 0, 48.7164, 49.2194, 49.0018, 
48.8849, 48.7363, 48.3709, 48.3061, 50.0755, 49.0511, 47.9882, 
48.7745, 48.5918, 49.0617, 48.5762, 53.3498, 48.5589, 48.9453, 
51.5074, 48.7557), Sessions = c(25963L, 13366L, 4732L, 3154L, 
2597L, 2462L, 2121L, 1918L, 1278L, 1099L, 715L, 663L, 653L, 620L, 
542L, 464L, 369L, 369L, 325L, 284L, 258L)), row.names = c(NA, 
-21L), class = "data.frame")

答案 1 :(得分:1)

最简单的方法是(slov_df是您的数据集):

library(sp)
library(ggplot2)

slov_reg <- fortify(slovakia_level_2)

ggplot() +
  geom_polygon(data = slov_reg, aes(x = long, y = lat, group = group), col = "black", fill = NA) +
  geom_point(data = slov_df, aes(x = Longitude, y = Latitude))

enter image description here

编辑

jay.sf的不错的解决方案。如果您愿意,让我提供另一种选择:

sp_google <- SpatialPointsDataFrame(coords=slov_df[1:2], data=slov_df[3], 
                                    proj4string=CRS(proj4string(slovakia_level_2)))


slovakia_level_2@data$Sessions <- over(slovakia_level_2, sp_google, fn = sum)$Sessions
slovakia_level_2@data$id <- row.names(slovakia_level_2@data)
slov_reg <- fortify(slovakia_level_2, region = "id")
slov_reg <- join(slov_reg, slovakia_level_2@data, by="id")


ggplot() +
  geom_polygon(data = slov_reg, aes(x = long, y = lat, group = group, fill = Sessions), col = "black") +
  scale_fill_gradient(low = "yellow",  high = "red", na.value = "lightgrey") +
  theme_bw()

还有更多工作要做,但是最终ggplot为您提供了更多的自定义选项。这是您的偏爱问题。

enter image description here