Home > Net >  Legend for combined graph
Legend for combined graph

Time:09-27

I am trying to reproduce this figure (without the Portugal highlight): enter image description here

The data (and figure) can be found in this link: enter image description here

As you can see, the legend looks substantially different and essentially I got stuck.

CodePudding user response:

One option to achieve your desired result would be via the ggnewscale package which allows for multiple scales for the same aesthetic. Doing so we could map category on the fill aes in both the geom_col and the geom_point but have two different legends:

Note: I simplified your data wrangling code a bit.

library(readxl)
library(dplyr)
library(ggplot2)
library(ggnewscale)

url <- "https://stat.link/uz49al"
download.file(url, destfile = "uz49al.xlsx")

dat <- read_excel("uz49al.xlsx", sheet = "Figure1.20", range = "A32:I68")
dat <- list(
  before = setNames(dat[, 1:5], c("Country", "Odds_ratio", "SE", "sig", "non_sig")),
  after = setNames(dat[, c(1, 6:9)], c("Country", "Odds_ratio", "SE", "sig", "non_sig"))
) %>%
  bind_rows(.id = "group2") 

dat <- dat %>%
  mutate(
    category = if_else(is.na(sig), "nonsig", "sig"),
    value = if_else(is.na(sig), non_sig, sig)
  ) %>%
  select(-sig, -non_sig)

group2_labels <- c(after = "After accounting for reading performance", before = "Before accounting for reading performance")

rect1 <- data.frame(xmin = 14.5, xmax = 15.5,  ymin = -Inf, ymax = Inf)

ggplot(dat, aes(x = reorder(Country,-Odds_ratio), y = value))  
  geom_col(data = ~filter(.x, group2 == "after"), aes(fill = category), width = 0.5)  
  scale_fill_manual(labels = NULL, values = c(sig = "darkblue", nonsig = "steelblue"), 
                    name = group2_labels[["after"]], guide = guide_legend(title.position = "right"))  
  new_scale_fill()  
  geom_point(data = ~filter(.x, group2 == "before"), aes(fill = category), size = 3, shape = 23, color = "lightblue")  
  geom_rect(data = rect1, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax),
            alpha = 0.5, inherit.aes = FALSE)  
  scale_fill_manual(labels = NULL, values = c(nonsig = "white", sig = "lightblue"), breaks = c("sig", "nonsig"),
                    name = group2_labels[["before"]], guide = guide_legend(title.position = "right"))  
  scale_y_continuous(breaks = scales::pretty_breaks(), limits = c(0, 25), expand = c(0, 0))  
  labs(x = NULL, y = "Odds ratio")  
  theme(axis.text.x = element_text(angle = 90, hjust = 1),
        legend.position = "top")

enter image description here

  • Related