2

I have a dataset where each rows corresponds to a country, while the other variables are:

  • quantity: average quantity per element in the country
  • elements: total number of elements in the country

The plot I would like to reproduce, is the same showed here, available on the Our World in Data website. Right now, I don't care to much about the arrows and the text. I would just like to have a barplot, where the columns width is proportioned to the number of elements and, at the same time, on the X-axis I don't want the country names, but a continuous sum of my elements (which should reach the total at the end of the X-axis).

Here's what I've achieved so far:

library(tidyverse)

data <- data.frame("country" = c("Argentina", "Peru", "Bolivia", "French Guinea"),
                   "quantity" = c(1.7, 2.2, 4.4, 4.3),
                   "elements" = c(11030725, 1082704, 4827537, 12665))

ggplot() +
  geom_col(data = data,
           aes(x = reorder(x = country,
                           X = -quantity),
               y = quantity,
               width = elements/10000000)) +
  labs(x = "Country",
       y = "Average quantity")

I've managed to reorder the bars by the "quantity" variable, but I don't understand how to show the total number of my elements (grouped by 10 million) on the X-axis. In addition, it seems also quite difficult to remove all the white space between the bars.

nd091680
  • 585
  • 4
  • 15

1 Answers1

4

One option would be to switch to geom_rect which requires some data wrangling to compute the xmin and xmax:

library(tidyverse)

data <- data.frame("country" = c("Argentina", "Peru", "Bolivia", "French Guinea"),
                   "quantity" = c(1.7, 2.2, 4.4, 4.3),
                   "elements" = c(11030725, 1082704, 4827537, 12665))

data <- data |> 
  mutate(country = reorder(country, -quantity)) |>
  arrange(country) |> 
  mutate(xmax = cumsum(elements),
         xmin = lag(xmax, default = 0))
           
ggplot() +
  geom_rect(data = data,
           aes(xmin = xmin, xmax = xmax,
               ymin = 0, ymax = quantity, fill = country)) +
  labs(x = "Country", y = "Average quantity")

stefan
  • 90,330
  • 6
  • 25
  • 51