rggplot2geom-map

ggplot add country names in legend below geom_map


I would like to add a legend for the country names below my map.

I have this dataframe of frequency of event occurrences on different regions:

trend_country_freq  <- structure(list(country = c("US", "CN", "KR", "IN", "AU", "GB", 
"JP"), n = c(25L, 20L, 12L, 5L, 2L, 1L, 1L), country_name = c("USA", 
"China", "South Korea", "India", "Australia", "UK", "Japan")), row.names = c(1L, 
2L, 3L, 4L, 5L, 7L, 8L), class = "data.frame")

Now I use the maps and ggplot2 packages to create a world map showing the frequency of event occurences:

library(maps)
library(ggplot2)

world_map <- map_data("world")
world_map <- subset(world_map, region != "Antarctica")

ggplot(trend_country_freq) +
  geom_map(
    dat = world_map, map = world_map, aes(map_id = region),
    fill = "white", color = "#7f7f7f", size = 0.25
  ) +
  geom_map(map = world_map, aes(map_id = country_name, fill = n), size = 0.25) +
  scale_fill_gradient(low = "#fff7bc", high = "#cc4c02", name = "Total Cases") +
  expand_limits(x = world_map$long, y = world_map$lat) + 
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank()) + 
  theme(axis.title = element_blank(),
        axis.ticks = element_blank(),
        axis.text = element_blank())

The result looks like this:

enter image description here

But I actually want something like this:

enter image description here

Do you have ideas how to generate such a map? Thank you very much!


Solution

  • We can simply write the text on as a geom layer:

    ggplot(trend_country_freq) +
      geom_map(
        dat = world_map, map = world_map, aes(map_id = region),
        fill = "white", color = "#7f7f7f", size = 0.25
      ) +
      geom_map(map = world_map, aes(map_id = country_name, fill = n), size = 0.25) +
      scale_fill_gradient(low = "#fff7bc", high = "#cc4c02", name = "Total Cases") +
      expand_limits(x = world_map$long, y = world_map$lat) + 
      theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
            panel.background = element_blank()) + 
      theme(axis.title = element_blank(),
            axis.ticks = element_blank(),
            axis.text = element_blank()) +
      geom_text(aes(label = paste0(country_name, ' (', n, ')'), 
                    x = rep(c(-50, 50), each = 4)[-8],
                    y = rep(seq(-90, -120, -10), 2)[-8]),
                hjust = 0)
    

    enter image description here