0

Bit of a strange problem using the leaflet package on R. I'm trying to colour in certain countries depending on how many users are in those countries. Everything goes well, except the countries are being coloured in with the wrong data. So for example, Morocco is being coloured in as if it were Jordan, etc.

I'm working with this free world map shapefile: http://thematicmapping.org/downloads/world_borders.php

When I draw a map with only the data included with the shapefile (data$POP2005), everything is fine. So perhaps there is a problem with my join?

user_data table:

NAME        USERS
Morocco     250
Jordan      1000
Canada      5007

Code used:

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

When I try the code above, Morocco is showing as 1000 users (the result Jordan should have). Other countries are similarly incorrect. What am I doing wrong?

Many thanks!

FPL
  • 456
  • 4
  • 21
  • I had a go at reproducing this, and although the numbers weren't on the map, when I looked at the underlying data, it was correct. And for e.g., Morocco showed as yellow, which is the low end of the colour scale you are defining, which looks right based on the data as well. – Jaccar Jan 11 '19 at 16:20

1 Answers1

1

I think that by merging world@data with itself is causing some strange interactions that are hard to track down (for example, in my first attempt Morocco was fine but Cuba was red). Instead I used sp::merge from the sp package which allowed me to simplify my code a bit:

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

And yielded this leaflet map (zoomed in here):

enter image description here

Stedy
  • 7,359
  • 14
  • 57
  • 77