4

Please see the map I drew below using the tmap package. I did not any find parameters that I can use to customize the font of the histogram legend. From the code below, you can see that I've already set the legend.text.fontface = 'bold'. However, this did not work.

psp1 <-   tm_shape(province) + 
  tm_borders(col = 'black') + 
  tm_shape(county) + 
  tm_polygons(col = '+1 °C', title = 'Changes in %', style = 'pretty', aes.palette = 'div', n=5, legend.hist = T) + 
  tm_compass(north = 0, type = 'arrow', show.labels =0, position = c('right','top')) + 
  tm_layout(legend.format = list(fun = function(x) formatC(x, digits = 1, format = "f")),
    legend.outside = T, legend.outside.position = 'bottom',
    legend.hist.width = 1,
    legend.hist.height = 0.5,
    legend.stack = 'horizontal',
    legend.title.fontface = 'bold',
    legend.text.fontface = 'bold')

enter image description here

Yabin Da
  • 553
  • 5
  • 11
  • Hi @Yabin Da, please find below one possible approach to bold the labels of the histogram... hoping that it will be still useful. Cheers. – lovalery Jan 30 '22 at 00:41

1 Answers1

2

Very interesting question. Indeed, it does not seem possible to change the font of the labels for the histogram using legend.text.fontface = 'bold'

Hopefully, it is possible to change this using the base R library grid on which the tmap library is based on.

So, please find below one possible solution to your request (hoping that this answer does not come too late and that it will still be useful to you)

Preliminary note for other Stackoverflow users: to run the reprex below correctly you will need to first download the data made available by the OP in this post.

Reprex

  • STEP 1 - BUILDING THE MAP WITH THE LEGEND
library(sf)
library(tmap)
library(RColorBrewer)


setwd("Add the path to your working directory")

# Import data
province <- st_read("province.shp")
county <- st_read("county.shp")


# Split the 'sf' object 'county' into a list of five 'sf' objects 
county_warm_list <- split(county , f = county$warming)

# Build the map with the legend
psp1 <- tm_shape(province) + 
  tm_borders(col = 'black') + 
  tm_shape(st_sf(county_warm_list[[3]])) +  # using the scenario +3°C
  tm_polygons(col = 'estimate', 
              title = 'Changes in %', 
              style = 'pretty', 
              aes.palette = 'div', 
              n=5, 
              legend.hist = TRUE, 
              midpoint = 0) + 
  tm_compass(north = 0, 
             type = 'arrow', 
             show.labels =0, 
             position = c('right','top')) + 
  tm_layout(legend.show = TRUE,
            legend.format = list(fun = function(x) formatC(x, digits = 1, format = "f")),
            legend.outside = TRUE, 
            legend.outside.position = 'bottom',
            legend.hist.width = 1,
            legend.hist.height = 0.5,
            legend.stack = 'horizontal',
            legend.title.fontface = 'bold',
            legend.text.fontface = 'bold')
  • STEP 2 - BOLD ALL THE LABELS IN THE LEGEND (i.e. including those in the histogram)
library(grid)

# Convert the 'tmap' object psp1 into a 'grob' object ('grob' = 'grid graphical object')
psp1 <- tmap_grob(psp1)


# Find the name of the element we want to change using 'grid.list()' which
# returns a listing of 'grobs' (including gTree)
grid.ls(psp1)
#> GRID.gTree.41
#>   multiple_1
#>     BG
#>       mapBG
#>       mapElements
#>         GRID.gTree.11
#>           tm_polygons_1_2
#>         GRID.gTree.12
#>           tm_polygons_1_3
#>       GRID.rect.13
#>       meta_with_bg
#>         meta
#>           GRID.gTree.16
#>             GRID.gTree.15
#>               compass
#>                 GRID.polygon.14
#>   outside_legend                 !!!! "outside_legend" element !!!!
#>     meta_with_bg
#>       meta
#>         legend
#>           GRID.rect.39
#>           GRID.gTree.40
#>             GRID.gTree.19
#>               GRID.gTree.18
#>                 GRID.text.17
#>             GRID.gTree.23
#>               GRID.gTree.22
#>                 GRID.rect.20
#>                 GRID.text.21
#>             GRID.gTree.38
#>               GRID.gTree.37
#>                 GRID.gTree.36
#>                   GRID.gTree.25
#>                     GRID.rect.24
#>                   GRID.gTree.27
#>                     GRID.polyline.26
#>                   GRID.gTree.29
#>                     GRID.text.28
#>                   GRID.gTree.33
#>                     GRID.gTree.30
#>                       GRID.lines.31
#>                       GRID.polyline.32
#>                   GRID.gTree.35
#>                     GRID.text.34

In the listing of grob objects just above, you can see an element named "outside_legend". So, we will modify it to bold the fonts of the legend:

# Edit the 'outside_legend' element of the 'grob' object 'psp1' using  
# 'editGrob()' and save it in the new 'grob' object 'my_map'
my_map <- editGrob(psp1, gPath("outside_legend"), gp = gpar(fontface = "bold"))


# Draw the 'grob' object 'my_map' 
# !!!! NB: may take a few seconds to be displayed in the graphic device !!!!
grid.draw(my_map)

enter image description here

  • STEP 3 - SAVING THE MAP EITHER MANUALLY OR PROGRAMMATICALLY (in the latter case, you need to install the rstudioapi library)
rstudioapi::savePlotAsImage(
  "my_map.png",   # add the path if different of the working directory
  format = "png", # other possible formats: "jpeg", "bmp", "tiff", "emf", "svg", "eps"
  width = 670,
  height = 710
)

And that's it :-)

Created on 2022-01-30 by the reprex package (v2.0.1)

lovalery
  • 4,524
  • 3
  • 14
  • 28