如何将数据点从数据框添加到斯洛伐克行政区域的多边形地图?
How to add data points from dataframe to polygon map of administrative regions of Slovakia?
请原谅我,如果这是一个基本问题,这是我第一次写在这里,所以先谢谢了。
我已经从 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 分析报告的示例:
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 的回答,第一张带红点的地图效果很棒!谢谢!
但是在热图的情况下,我遇到了错误并且无法重现同一张地图,因为我遇到了几个错误。
下面是我的代码,我不确定问题出在哪里,因为我试图将我的数据框命名为 ses
,就像 jay 的回答一样。
##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
非常感谢您对我的第一个问题提供的帮助,我无法表达对 Whosebug 所有人的敬意。
谢谢
最简单的方法是这样(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))
编辑:
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 为您提供了更广泛的自定义选项。看你喜好了。
实际上 sp
包中包含一个 coordinates()
函数(从 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")
要使用您的 google 分析数据(此处 ses
)获取热图,我们可以使用 spplot()
,也包含在 sp
中。首先,我们需要创建一个 SpatialPointsDataFrame
,根据 this post on gis.stackexchange,我们聚合以匹配来自 slovakia_level_2
.
的 ses$Sessions
点和多边形
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")
结果
数据
# 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")
请原谅我,如果这是一个基本问题,这是我第一次写在这里,所以先谢谢了。
我已经从 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 分析报告的示例:
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 的回答,第一张带红点的地图效果很棒!谢谢!
但是在热图的情况下,我遇到了错误并且无法重现同一张地图,因为我遇到了几个错误。
下面是我的代码,我不确定问题出在哪里,因为我试图将我的数据框命名为 ses
,就像 jay 的回答一样。
##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
非常感谢您对我的第一个问题提供的帮助,我无法表达对 Whosebug 所有人的敬意。
谢谢
最简单的方法是这样(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))
编辑:
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 为您提供了更广泛的自定义选项。看你喜好了。
实际上 sp
包中包含一个 coordinates()
函数(从 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")
要使用您的 google 分析数据(此处 ses
)获取热图,我们可以使用 spplot()
,也包含在 sp
中。首先,我们需要创建一个 SpatialPointsDataFrame
,根据 this post on gis.stackexchange,我们聚合以匹配来自 slovakia_level_2
.
ses$Sessions
点和多边形
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")
结果
数据
# 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")