Caroline
Caroline

Reputation: 470

Can anyone suggest a good world map visualization for use in Shiny?

Sorry in advance for the wall of text. I am creating a sort of novel type of choropleth map, in which countries are shaded based on different categorical variables. The way I've set up the app, I assign each country an RGB value based on its levels of each of the underlying variables and I want the map to show that RGB value--seems simple, right?

Unfortunately, most of the map visualizations seem to want to do the color selection for me, rather than letting me choose. The best I've been able to do is to treat the data as categorical and I end up with the same number of categories as countries. This worked fairly well for rworldmap. The problem is, I'm developing this for web use, and I'd really like to have tooltips so that you can hover over a particular country and this doesn't work with rworldmap, as it's just a basic plot. Also, the rworldmap output is not particularly nice looking.

Here's the code I used with that:

mapjoin <- joinCountryData2Map(db, joinCode="ISO3", 
  nameJoinColumn="iso", mapResolution="high")

mapCountryData(mapjoin, nameColumnToPlot="iso", addLegend=FALSE,
  catMethod="categorical", colourPalette=db$rgb, mapTitle=input$year)

I have experimented with googleVis, but I was having a lot of trouble with that--the map would just disappear for no reason and I'd have to reload the page, which I believe was an issue with the Shiny bindings in the googleVis package. I ultimately went with googleCharts (https://github.com/jcheng5/googleCharts), which clears up the problems with the bindings.

However, I'm still having problems.

Here's the reactive function:

output$mapviz <- reactive({
  db <- genRgb()

  list(
    data=googleDataTable(db[c("country", "id")]),
    options=list(legend="none", projection="kavrayskiy-vii", colors=db$rgb)
  )
)}

and here's the output call:

googleGeoChart("mapviz", width="100%", height="780px")

As you can see, there's not a specific way to clue the JS app that it's categorical data, so as a result, it's making a choropleth with 182 different gradient stop points. Usually this works fine, but occasionally something weird happens and a country mysteriously ends up in an intermediate place between colors. I can always tell that there's a problem because certain countries are supposed to be specific colors (for instance, the U.S. will show as #0000FF, and it's pretty obvious when it's not). I've found that I can go to a different chart type (the app uses other googleCharts types) and then return to the map and usually it's fixed. So it's completely inconsistent.

So with that in mind, can anyone suggest a better mapping tool that I can implement in Shiny that would work well for this purpose?

Thanks!

Upvotes: 1

Views: 2002

Answers (1)

Chris
Chris

Reputation: 6372

Check out leaflet:

https://rstudio.github.io/leaflet/

It will allow you to:

  • have pop-ups for each shapefile with more data
  • explicitly set the colour of shapefiles in R, based on data in your dbf file.
  • use an open map background

Some example code (not all may be relevant):

map <- leaflet()%>%
        addTiles(urlTemplate = url, attribution = HTML(attrib))%>%
        addPolygons(data = sub_shape,
                    fill = TRUE,
                    fillColor = colors$color, #set color here
                    fillOpacity = .8,
                    stroke = TRUE,
                    weight = 3,
                    color = "white",
                    dashArray = c(5,5),
                    popup = pops
        )

Upvotes: 3

Related Questions