在R上使用Leaflet程序包会产生一个奇怪的问题。我试图在某些国家/地区进行着色,具体取决于这些国家/地区中的用户数量。一切进展顺利,除了这些国家的数据错误。举例来说,摩洛哥就像乔丹一样被染成彩色。
我正在使用这个免费的世界地图shapefile:http://thematicmapping.org/downloads/world_borders.php
当我仅使用shapefile(data $ POP2005)中包含的数据绘制地图时,一切都很好。那么也许我的加入存在问题?
user_data
表:
NAME USERS
Morocco 250
Jordan 1000
Canada 5007
使用的代码:
world <- readOGR(dsn=path.expand("~/TM_WORLD_BORDERS_SIMPL-0.3"),
layer="TM_WORLD_BORDERS_SIMPL-0.3")
world@data <- merge(world@data, user_data, by="NAME", all.x = TRUE)
pal <- colorBin("YlOrRd", domain = world@data$USERS, bins = 5)
m <- leaflet(world) %>%
addTiles() %>%
addPolygons(
fillColor = ~pal(world@data$USERS),
weight = 2,
opacity = 1,
color = "white",
dashArray = "3",
fillOpacity = 0.7)
m
当我尝试上面的代码时,摩洛哥显示为1000个用户(约旦应该有的结果)。其他国家同样是不正确的。我在做什么错了?
非常感谢!
答案 0 :(得分:1)
我认为通过将world@data
与自身合并会导致一些难以跟踪的奇怪交互(例如,在我的第一次尝试中,摩洛哥很好,但古巴却很烂)。取而代之的是,我使用了sp包中的sp::merge
,这使我可以简化代码:
library(rgdal)
library(leaflet)
user_data <- data.frame(NAME = c("Morocco", "Jordan", "Canada"),
USERS = c(250, 1000, 5007))
world <- readOGR(dsn="TM_WORLD_BORDERS_SIMPL-0.3.shp",
layer="TM_WORLD_BORDERS_SIMPL-0.3")
world_merged <- sp::merge(world, user_data)
pal <- colorBin("YlOrRd", domain = world_merged$USERS, bins = 5)
m <- leaflet(world) %>%
addTiles() %>%
addPolygons(
fillColor = ~pal(world_merged$USERS),
weight = 2,
opacity = 1,
color = "white",
dashArray = "3",
fillOpacity = 0.7)
m
并生成了此传单地图(在此处放大):