【问题标题】:How to add data points from dataframe to polygon map of administrative regions of Slovakia?如何将数据框中的数据点添加到斯洛伐克行政区的多边形地图?
【发布时间】:2019-11-20 21:41:42
【问题描述】:

如果这是一个基本问题,请原谅我,这是我第一次在这里写,所以提前致谢。

我从 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 进行的,但是当我需要绘制点时我卡住了。

这是来自谷歌分析的报告的示例:

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

非常感谢您对我的第一个问题提供了如此大的帮助,我无法向 StackOverflow 的所有人表达我的尊重。

谢谢

【问题讨论】:

    标签: r plot geospatial polygon ggmap


    【解决方案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))
    
    

    编辑

    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 为您提供了更广泛的自定义选项。这是您的偏好问题。

    【讨论】:

    • 您好,非常感谢您的快速回复,我深表敬意。我已经尝试过了,但是在代码 geom_point 的最后一部分中,我收到了这个错误错误:离散值提供给连续比例?是否由于我的数据框中的变量类型经度和纬度是字符,应该是数字?再次感谢并祝您有美好的一天
    • 嗨,是的,latitudelongitude必须是数字。
    • 哦,顺便说一句:您的 df 中有一些点位于斯洛伐克之外。您应该删除任何带有负号的坐标。
    • 我试图将经度和纬度转换为数字,所以我的结束代码看起来像这样 library(sp) library(ggplot2) lugera$Longitude &lt;- as.numeric(gsub(".", "", lugera$Longitude, fixed = TRUE)) lugera$Latitude &lt;- as.numeric(gsub(".", "", lugera$Latitude, fixed = TRUE)) slov_reg &lt;- fortify(slovakia_level_1) ggplot() + geom_polygon(data = slov_reg, aes(x = long, y = lat, group = group), col = "black", fill = NA) + geom_point(data = lugera, aes(x = Longitude, y = Latitude)) 但现在只有点在图上,并且缺少区域的地图。感谢您的耐心等待
    • 啊哈,那么所有的缺点都应该删除吗?请原谅我耽误您的时间。我认为答案是正确的,只是我需要让它运行。
    【解决方案2】:

    其实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")
    

    要使用您的谷歌分析数据(此处为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")
    

    结果

    数据

    # 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")
    

    【讨论】:

    • 哦,这太美了!我相信如果我接受这个作为答案是可以的。这绝对回答了我的问题。非常感谢!它工作得很好。杰伊度过愉快的一天
    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 2015-12-21
    • 2019-08-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 2016-09-23
    相关资源
    最近更新 更多