6

I am trying to replicate this figure from the BBC. I'm close, but I'm struggling to make the legend symbols thin. Is this possible?

enter image description here

library(tidyverse)
library("rio")
url <- "https://gist.githubusercontent.com/ericpgreen/a728be304b811fe7708699682eb4ba42/raw/fd924596e30c131dbaf97c00c9d9863bb40abb9a/bbcCovid.R"
df_plot <- rio::import(url)

ggplot(df_plot, aes(x=date, 
                    y=reorder(Country.Region, 
                              total, 
                              order=TRUE))) +
  geom_tile(aes(fill=casesRollf), 
            color="white", 
            na.rm = TRUE
            #, key_glyph = draw_key_timeseries
  ) +
  theme_bw() + theme_minimal() +
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        legend.title = element_blank(),
        plot.title.position = "plot") +
  scale_x_date(breaks = as.Date(c("2020-02-14",
                                  "2020-03-05",
                                  "2020-03-25",
                                  "2020-04-14")),
               date_labels = "%d %b") +
  scale_fill_manual(values=
                      c("#e4e4e4", "#ffeed2", 
                        "#ffda64", "#faab19", 
                        "#d2700d",  
                        "#d56666", "#9a1200", 
                        "#5b0600", "#000000"),
                    guide = guide_legend(reverse = TRUE),
                    labels=c("No cases", "1 to 10",
                             "11 to 50", "51 to 100",
                             "101 to 250", "251 to 500",
                             "501 to 1,000", "1,001 to 5,000",
                             "> 5,000")) +
  labs(title = "Where are the most new coronavirus cases?",
       subtitle = "New confirmed cases, three-day rolling average",
       x="",
       y="")

enter image description here

Eric Green
  • 7,385
  • 11
  • 56
  • 102
  • 1
    for a better readable legend - maybe consider something like the 'discrete color bar' https://stackoverflow.com/q/50506832/7941188 – tjebo Apr 16 '20 at 22:30
  • 3
    I suggest to add also the option `legend.justification = "top"` inside `theme` – Marco Sandri Apr 16 '20 at 22:34
  • I was going to suggest that the BBC do the same thing. That legend popping over the top of the chart is doing my head in! – Andy Baxter Apr 17 '20 at 16:08

1 Answers1

7

You can use legend.key.width in theme. To be even closer to the original graph, you can have the use of legend.position and plot.margin such as:

ggplot(df_plot, aes(x=date, 
                    y=reorder(Country.Region, 
                              total, 
                              order=TRUE))) +
  geom_tile(aes(fill=casesRollf), 
            color="white", 
            na.rm = TRUE
            #, key_glyph = draw_key_timeseries
  ) +
  theme_bw() + theme_minimal() +
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(c("2020-02-14",
                                  "2020-03-05",
                                  "2020-03-25",
                                  "2020-04-14")),
               date_labels = "%d %b") +
  scale_fill_manual(values=
                      c("#e4e4e4", "#ffeed2", 
                        "#ffda64", "#faab19", 
                        "#d2700d",  
                        "#d56666", "#9a1200", 
                        "#5b0600", "#000000"),
                    guide = guide_legend(reverse = TRUE),
                    labels=c("No cases", "1 to 10",
                             "11 to 50", "51 to 100",
                             "101 to 250", "251 to 500",
                             "501 to 1,000", "1,001 to 5,000",
                             "> 5,000")) +
  labs(title = "Where are the most new coronavirus cases?",
       subtitle = "New confirmed cases, three-day rolling average",
       x="",
       y="")+
  theme(plot.margin=unit(c(0.25,2,0.25,0.25),"cm"),
        legend.position=c(1.03,0.72),
        legend.key.width = unit(0.4,"line"))

enter image description here

BTW: Nice piece of work ;)

dc37
  • 15,840
  • 4
  • 15
  • 32