I want to plot a world map using ggplot2 (v.9) which combines two pieces if information. The following example illustrates:
library(rgdal) library(ggplot2) library(maptools) # Data from http://thematicmapping.org/downloads/world_borders.php. # Direct link: http://thematicmapping.org/downloads/TM_WORLD_BORDERS_SIMPL-0.3.zip # Unpack and put the files in a dir 'data' gpclibPermit() world.map <- readOGR(dsn="data", layer="TM_WORLD_BORDERS_SIMPL-0.3") world.ggmap <- fortify(world.map, region = "NAME") n <- length(unique(world.ggmap$id)) df <- data.frame(id = unique(world.ggmap$id), growth = 4*runif(n), category = factor(sample(1:5, n, replace=T))) ## noise df[c(sample(1:100,40)),c("growth", "category")] <- NA ggplot(df, aes(map_id = id)) + geom_map(aes(fill = growth, color = category), map =world.ggmap) + expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + scale_fill_gradient(low = "red", high = "blue", guide = "colorbar")
However, this solution is not a nice way to display both growth
and category
. Growth
is highly visible, but category
is almost impossible to see because it is just a border.
I have tried to increase the size of borders, but without luck (the new geom_map is hard to work with). Does anyone knows how to increase border size in the above example, or even better, a mechanism to display two factors?
A bonus question: country names, such as those used by the maps package (which features USSR!) are the data used in the example is fragile. I prefer to use ISO 3166-1 alpha-3(1). Does anyone know data readily usable with ggplot2 which features ISO-... country names (included in linked data)
Result:
result http://ompldr.org/vY3hsYQ
I would use different hue ranges for fill and line color:
ggplot(df, aes(map_id = id)) + geom_map(aes(fill = growth, color = category), map =world.ggmap) + expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + scale_fill_gradient(high = "red", low = "white", guide = "colorbar") + scale_colour_hue(h = c(120, 240))
OR, use fill for category and transparency for growth level.
ggplot(df, aes(map_id = id)) + geom_map(aes(alpha = growth, fill = category), map =world.ggmap) + expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + scale_alpha(range = c(0.2, 1), na.value = 1)
It depends on what you want to show.
Just in case, here is the way to change the linesize:
ggplot(df, aes(map_id = id)) + geom_map(aes(fill = growth, color = category, size = factor(1)), map =world.ggmap) + expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + scale_fill_gradient(high = "red", low = "white", guide = "colorbar") + scale_colour_hue(h = c(120, 240)) + scale_size_manual(values = 2, guide = FALSE)
Here is HSV version:
df$hue <- ifelse(is.na(df$category), 0, as.numeric(df$category)/max(as.numeric(df$category), na.rm=T)) df$sat <- ifelse(is.na(df$growth), 0, df$growth/max(df$growth, na.rm=T)) df$fill <- ifelse(is.na(df$category), "grey50", hsv(df$hue, df$sat)) ggplot(df, aes(map_id = id)) + geom_map(aes(fill = fill), map =world.ggmap) + expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + scale_fill_identity(guide = "none")
One option is to map growth to the size of some points plotted at the centroid of the polygons.
centroids <- as.data.frame(coordinates(world.map)) df <- data.frame(df,centroids) choropleth <-ggplot() + geom_map(aes(fill = category, map_id = id),data = df, map =world.ggmap) + expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + scale_fill_hue(na.value=NA) choropleth choropleth + geom_point(aes(x=V1,y=V2,size=growth),data=df) + scale_area(range=c(0,3))
Or if you really want to double code color, you could color the points instead. Note, that you can also add a raster map of satellite imagery with the new OpenStreetMap package (shameless plug).
library(OpenStreetMap) library(raster) rastermap <- openmap(c(70,-179), c(-70,179),zoom=2,type='bing') rastermap <- openproj(rastermap) autoplot(rastermap,expand=FALSE) + geom_map(aes(x=70,y=70,fill = category, map_id = id),data = df, map =world.ggmap) + expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + scale_fill_hue(na.value=NA) + geom_point(aes(x=V1,y=V2,colour=growth),data=df) + scale_colour_gradient(low = "red", high = "blue", guide = "colorbar",na.value=NA)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With