Reputation: 7725
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?
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="")
Upvotes: 6
Views: 399
Reputation: 16178
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"))
BTW: Nice piece of work ;)
Upvotes: 7