使用 rgeolocate 图在 R 中覆盖世界地图
Overlay worldmap in R with rgeolocate plot
在我之前的问题中,我提出我有 table 个带 IP 的“帖子”,我想对它们进行地理定位。
答案演示了如何使用 rgeolocate 来实现这一点,在学习 R 的一些努力之后,我设法实现了相同的结果:
library(iptools)
library(rgeolocate)
library(tidyverse)
library(readxl)
library(rworldmap)
library(ggmap)
library(rworldxtra)
post <- read_excel("filepath/post.xlsx")
view(post)
## grab my ips and, format them
ips <- unlist(post[,3], use.names=FALSE)
#geolocte them
system.time(
rgeolocate::maxmind(
ips, "~/R/GeoLite2-City.mmdb", c("longitude", "latitude")
) -> xdf
)
#user system elapsed
#6.04 0.02 6.05
xdf %>%
count(longitude, latitude) -> pts
#And, plot them:
ggplot(pts) +
geom_point(
aes(longitude, latitude, size = n),
shape=21, fill = "steelblue", color = "white", stroke=0.25
) +
ggalt::coord_proj("+proj=wintri") +
ggthemes::theme_map() +
theme(legend.justification = "center") +
theme(legend.position = "bottom")
此处显示结果:
根据数据,该图准确地显示了我所期望的分组类型。那么成功的一步!
当然,下一个合乎逻辑的步骤是增加分辨率并添加世界地图的叠加层。我一直无法实现这两个目标中的任何一个。
使用这段代码,我可以制作高分辨率的世界地图:
newmap <- getMap(resolution = "high")
plot(newmap)
结果如下所示:
不知何故,我无法实现地图和正在绘制的数据的组合。似乎任何创建地图的尝试都需要我绘制地图本身,而任何向其添加点的尝试都失败了。例如:
newmap <- getMap(resolution = "high")
plot(newmap)
ggmap(newmap) +
geom_point(data = pts, aes(x = longitude, y = latitude, size=n),
shape=21, fill = "steelblue", color = "white", stroke=0.25)
Error: ggmap plots objects of class ggmap, see ?get_map
我一直在尝试根据 http://www.milanor.net/blog/maps-in-r-plotting-data-points-on-a-map/ 的建议工作,但是这个网站专注于欧洲地图,我想在世界地图上显示我的数据。
感谢您的帮助。
library(iptools)
library(rgeolocate)
library(tidyverse)
ips <- ip_random(1000000)
rgeolocate::maxmind(
ips, "~/Data/GeoLite2-City.mmdb", c("longitude", "latitude")
) -> xdf
xdf %>%
mutate(
longitude = (longitude %/% 5) * 5,
latitude = (latitude %/% 5) * 5
) %>%
count(longitude, latitude) -> pts
wrld <- tbl_df(map_data("world"))
wrld <- filter(wrld, region != "Antarctica")
ggplot() +
geom_map(
map = wrld, data = wrld, aes(long, lat, map_id=region),
color = "black", fill ="white", size=0.125
) +
geom_point(
data = pts, aes(longitude, latitude, size = n),
shape=21, fill = "steelblue", color = "white", stroke=0.25
) +
scale_size(name = "# IPs", label=scales::comma) +
ggalt::coord_proj("+proj=wintri") +
ggthemes::theme_map() +
theme(legend.justification = "center") +
theme(legend.position = "bottom")
在我之前的问题中,我提出我有 table 个带 IP 的“帖子”,我想对它们进行地理定位。
答案演示了如何使用 rgeolocate 来实现这一点,在学习 R 的一些努力之后,我设法实现了相同的结果:
library(iptools)
library(rgeolocate)
library(tidyverse)
library(readxl)
library(rworldmap)
library(ggmap)
library(rworldxtra)
post <- read_excel("filepath/post.xlsx")
view(post)
## grab my ips and, format them
ips <- unlist(post[,3], use.names=FALSE)
#geolocte them
system.time(
rgeolocate::maxmind(
ips, "~/R/GeoLite2-City.mmdb", c("longitude", "latitude")
) -> xdf
)
#user system elapsed
#6.04 0.02 6.05
xdf %>%
count(longitude, latitude) -> pts
#And, plot them:
ggplot(pts) +
geom_point(
aes(longitude, latitude, size = n),
shape=21, fill = "steelblue", color = "white", stroke=0.25
) +
ggalt::coord_proj("+proj=wintri") +
ggthemes::theme_map() +
theme(legend.justification = "center") +
theme(legend.position = "bottom")
此处显示结果:
根据数据,该图准确地显示了我所期望的分组类型。那么成功的一步!
当然,下一个合乎逻辑的步骤是增加分辨率并添加世界地图的叠加层。我一直无法实现这两个目标中的任何一个。
使用这段代码,我可以制作高分辨率的世界地图:
newmap <- getMap(resolution = "high")
plot(newmap)
结果如下所示:
不知何故,我无法实现地图和正在绘制的数据的组合。似乎任何创建地图的尝试都需要我绘制地图本身,而任何向其添加点的尝试都失败了。例如:
newmap <- getMap(resolution = "high")
plot(newmap)
ggmap(newmap) +
geom_point(data = pts, aes(x = longitude, y = latitude, size=n),
shape=21, fill = "steelblue", color = "white", stroke=0.25)
Error: ggmap plots objects of class ggmap, see ?get_map
我一直在尝试根据 http://www.milanor.net/blog/maps-in-r-plotting-data-points-on-a-map/ 的建议工作,但是这个网站专注于欧洲地图,我想在世界地图上显示我的数据。
感谢您的帮助。
library(iptools)
library(rgeolocate)
library(tidyverse)
ips <- ip_random(1000000)
rgeolocate::maxmind(
ips, "~/Data/GeoLite2-City.mmdb", c("longitude", "latitude")
) -> xdf
xdf %>%
mutate(
longitude = (longitude %/% 5) * 5,
latitude = (latitude %/% 5) * 5
) %>%
count(longitude, latitude) -> pts
wrld <- tbl_df(map_data("world"))
wrld <- filter(wrld, region != "Antarctica")
ggplot() +
geom_map(
map = wrld, data = wrld, aes(long, lat, map_id=region),
color = "black", fill ="white", size=0.125
) +
geom_point(
data = pts, aes(longitude, latitude, size = n),
shape=21, fill = "steelblue", color = "white", stroke=0.25
) +
scale_size(name = "# IPs", label=scales::comma) +
ggalt::coord_proj("+proj=wintri") +
ggthemes::theme_map() +
theme(legend.justification = "center") +
theme(legend.position = "bottom")