gpt4 book ai didi

r - 如何使用 ggmap 正确连接数据和几何

转载 作者:行者123 更新时间:2023-12-04 10:43:30 25 4
gpt4 key购买 nike

一张图片胜过千言万语:
Data does not match geometry

观察到的行为:从上图可以看出,国家名称与其实际几何形状不匹配。

预期行为:我想正确地将数据框与其几何图形连接起来,并在 ggmap 中显示结果。

我以前加入过不同的数据框,但显然 ggmap 导致事情出错了。需要“强化”(实际上我不知道真正的意思)数据框以显示结果。

这是我到目前为止所做的:

library(rgdal)
library(dplyr)
library(broom)
library(ggmap)

# Load GeoJSON file with countries.
countries = readOGR(dsn = "https://gist.githubusercontent.com/ccamara/fc26d8bb7e777488b446fbaad1e6ea63/raw/a6f69b6c3b4a75b02858e966b9d36c85982cbd32/countries.geojson")

# Load dataframe.
df = read.csv("https://gist.githubusercontent.com/ccamara/fc26d8bb7e777488b446fbaad1e6ea63/raw/a6f69b6c3b4a75b02858e966b9d36c85982cbd32/sample-dataframe.csv")

# Join geometry with dataframe.
countries$iso_a2 = as.factor(countries$iso_a2)
countries@data = left_join(countries@data, df, by = c('iso_a2' = 'country_code'))

# Convert to dataframe so it can be used by ggmap.
countries.t = tidy(countries)

# Here's where the problem starts, as by doing so, data has been lost!

# Recover attributes' table that was destroyed after using broom::tidy.
countries@data$id = rownames(countries@data) # Adding a new id variable.
countries.t = left_join(countries.t, countries@data, by = "id")

ggplot(data = countries.t,
aes(long, lat, fill = country_name, group = group)) +
geom_polygon() +
geom_path(colour="black", lwd=0.05) + # polygon borders
coord_equal() +
ggtitle("Data and geometry have been messed!") +
theme(axis.text = element_blank(), # change the theme options
axis.title = element_blank(), # remove axis titles
axis.ticks = element_blank()) # remove axis ticks

最佳答案

虽然你的工作是一种合理的方法 - 我想重新考虑你的设计,主要是因为两个简单的原因:

1) 虽然 GeoJSON 是 future ,但 R 仍然严重依赖 sp 包及其对应的 sp* 对象 - 很快您希望自己早点切换。这只是关于包,其中大多数(如果不是全部)依赖于 sp* 对象。

2) ggplot 与 ggmap 结合具有强大的绘图能力 - 但与 sp* 结合 R 等的传单相比,它仍然相当有限。

可能最快的方法很简单:

library(sp)
library(dplyr)
library(geojsonio)
library(dplyr)
library(tmap)

#get sp* object instead of geojson
countries <- geojsonio::geojson_read("foo.geojson",what = "sp")

#match sp* object with your data.frame
countries@data <- dplyr::left_join(countries@data, your_df, by =
c("identifier_1" = "identifier_2"))

#creates a fast and nice looking plot / lots of configuration available
p1 <- tm_shape(countries) +
tm_polygons()
p1

#optional interactive leaflet plot
tmap_leaflet(p1)

如果有小问题,它是从我的脑海中写出来的/请多多包涵。

这是一种不同的方法,但至少在我看来,它现在是 R 中更快、更简洁的方法(希望 geojson 将来会得到更多支持)。

关于r - 如何使用 ggmap 正确连接数据和几何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46277574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com