[R-sig-Geo] Labelling a fortified GADM map plotted with ggplot and geom_map
Roger Bivand
Roger.Bivand at nhh.no
Mon Mar 19 17:40:31 CET 2018
On Mon, 19 Mar 2018, Kenneth Dyson wrote:
> Reffered here from the R-Help mailing list:
>
> I am having trouble getting data labels to display over the provinces in
> a GADM map of Canada. Specifically, I need the variable "Number" from
> the data set "by_province", grouped by "region", to appear on the
> corresponding regions of the map.
You are making life unnecessarily difficult. Use the tmap package instead,
see for example:
https://www.johnmackintosh.com/2017-09-01-easy-maps-with-tmap/
using the sf representation and forgetting ggplot2 (the development
version supports geom_sf, but hasn't been released).
Roger
>
> The data set "by_province" looks like this:
>
> long lat order hole piece region group Number
> -110.37074 60.00006 1 FALSE 1 Alberta Alberta.1 132
> -110.36250 60.00006 2 FALSE 1 Alberta Alberta.1 132
> -110.35103 60.00006 3 FALSE 1 Alberta Alberta.1 132
>
> and the data set "tract" is the map data without the "Number" variable.
>
> I looked into working this out from by researching the geom_map function here: http://ggplot2.tidyverse.org/reference/geom_map.html
>
> my code looks like this:
> # get the raw map data
> can_map <- getData('GADM', country = "CAN", level = 1) # download map level with provinces
> tract <- fortify(can_map, region = "NAME_1") # transforms data from shapefiles into a dataframe that ggplot can understand, from http://www.kevjohnson.org/making-maps-in-r/
>
> # create subsets of the kcj data if needed, for example by year
> kids_data_2017 <- subset(kids_data, year == 2017) # data for the year 2017
> kids_data_2018 <- subset(kids_data, year == 2018) # data for the year 2018
>
> # extract the needed data
> kids_province_data <- data.table::data.table(kids_data_2017$Province_Territory__c, kids_data_2017$Number_of_kids__c)
> names(kids_province_data)[1] <- "Province"
> names(kids_province_data)[2] <- "Number"
>
> # sum the data by province
> kids_province_sums <- aggregate(.~Province, data = kids_province_data, sum)
>
> # join the data to the map
> names(tract)[6] <- "region"
> names(kids_province_sums)[1] <- "region"
> by_province <- left_join(tract, kids_province_sums)
>
> # create the data map
> kids_map <- ggplot(by_province, aes(map_id = region)) + #plots the map in by_province separating by region
> geom_map(aes(fill = Number), #generates aestheticsa for the plot
> map = tract, #takes the data from tract
> color = "#ffffff", #makes the color of the borders between regions white
> size = 0.15) + #sets the thickness of the boarder lines
> coord_map("polyconic") + #sets the coordinates to polyconic (rounded lat and long)
> scale_fill_gradient(name = "Children Reached", #sets the gradient of the value scale: names the scale
> low = grey_2, #color of the low end
> high = orange_1) + #color of the high end
> expand_limits(x = tract$long, #ensure limits include all values for all plots
> y = tract$lat) +
> labs(x = NULL, #add labels, no x title
> y = NULL, #no y title
> title = "Number of Children Reached by Province", #map title
> subtitle = "2017") + #map subtitle
> geom_text(data = by_province, #add a text layer
> aes(long, #aethetics for the text, x axis
> lat, #y axis
> label = Number, #the value to display
> size=3)) + #size of the text
> theme(axis.ticks = element_blank(), #theme of the graph, no axis ticks
> axis.text = element_blank(), #no axis text
> panel.background = element_blank(), #blank background
> panel.border = element_blank()) #blank border
>
> # save as png
> ggsave(kids_map, file = "kids_map.png", width = 6, height = 4.5, type = "cairo-png”)
>
>
> I have asked this question on stack overflow, and was refered to this answer:
> https://stackoverflow.com/questions/9441436/ggplot-centered-names-on-a-map
>
> The solution there did not fix my problem, though it did get me closer.
> The solution on that post is using a single vector of labels.
>
> My post on stackoverflow has images of my output:
> https://stackoverflow.com/questions/49118323/labelling-a-map-plotted-with-geom-map
>
> [[alternative HTML version deleted]]
>
> _______________________________________________
> R-sig-Geo mailing list
> R-sig-Geo at r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>
--
Roger Bivand
Department of Economics, Norwegian School of Economics,
Helleveien 30, N-5045 Bergen, Norway.
voice: +47 55 95 93 55; e-mail: Roger.Bivand at nhh.no
http://orcid.org/0000-0003-2392-6140
https://scholar.google.no/citations?user=AWeghB0AAAAJ&hl=en
More information about the R-sig-Geo
mailing list