rggplot2geom-tileggpattern

Setting a pattern or symbol as NA value in geom_tile


I have data i want to visualise using geom_tile. The data deal with references in text data from either Germany or Spain to other European countries.

Example data:

data<- tribble(
  ~Ref_country, ~Country, ~Share,
  "ENG", "DE", 0.27,
  "ENG", "ES", 0.24,
  "ESP", "DE", 0.21,
  "ESP", "ES", NA,
  "GER", "DE", NA,
  "GER", "ES", 0.13,
  "FRA", "DE", 0.11,
  "FRA", "ES", 0.18,
  "ITA", "DE", 0.1,
  "ITA", "ES", 0.17,
  "POR", "DE", 0.03,
  "POR", "ES", 0.07,
  "RUS", "DE", 0.02,
  "RUS", "ES", 0.02,
  "NLD", "DE", 0.04,
  "NLD", "ES", 0.01,
  "BEL", "DE", 0.02,
  "BEL", "ES", 0.03,
  "SWE", "DE", 0.01,
  "SWE", "ES", 0.01
)

Since i do not count references from a country to itself, GER-DE and ESP-ES are NA.

I plot this with ggplot, geom_tile and scale_fill_distiller:

x %>% 
  ggplot(., aes(x = Ref_country, y = Country, fill = Share)) +
  geom_tile(color = "white", linewidth = 0.1) +
  scale_fill_distiller(
    type = "seq",
    direction = 1,
    palette = "Greys",
    na.value = "white"
  )

resulting in the following plot

My question is: is there a way to distinguish the NAs not by color, but by pattern? Maybe through a creative application of ggpattern. Or alternatively, is it possible to add text ("NA") or a shape on top of the respective NA tiles? Since I will likely publish it in black and white, color is not a good distinguishing property.

Thanks in advance.

PS: As another alternative, can the color scale be restricted to greys that are clearly distinguishible from white?


Solution

  • As you mentioned in your comment, the first option which came to my mind would be to use a "transparent" color for the missings. Additionally I switched to guide_bins for the legend. And of course could you also add a symbol for the missings using e.g. a geom_text layer or perhaps a geom_point:

    library(ggplot2)
    library(magrittr)
    
    data %>%
      ggplot(., aes(x = Ref_country, y = Country, fill = Share)) +
      geom_tile(color = "white", linewidth = 0.1) +
      scale_fill_distiller(
        type = "seq",
        direction = 1,
        palette = "Greys",
        na.value = "transparent",
        guide = guide_bins(axis = FALSE, keywidth = unit(1, "cm"))
      ) +
      theme(legend.position = "bottom")
    

    
    data %>%
      ggplot(., aes(x = Ref_country, y = Country, fill = Share)) +
      geom_tile(color = "white", linewidth = 0.1) +
      geom_text(data = ~ subset(.x, is.na(Share)), aes(label = "X")) +
      scale_fill_distiller(
        type = "seq",
        direction = 1,
        palette = "Greys",
        na.value = "transparent",
        guide = guide_bins(axis = FALSE, keywidth = unit(1, "cm"))
      ) +
      theme(legend.position = "bottom")