Как построить эту картинку с помощью ggplot2? - PullRequest
1 голос
/ 14 марта 2020

enter image description here

Выше мой набор данных, просто простой набор данных. Он показывает ВВП на душу населения самых богатых и самых бедных регионов в девяти странах в 2000 и 2015 годах, а также разрыв в ВВП на душу населения между самыми бедными и самыми богатыми регионами. Ниже приведен воспроизводимый пример этого набора данных:

structure(list(Country = c("Britain", "Germany", "United State", 
"France", "South Korea", "Italy", "Japan", "Spain", "Sweden"), 
    Poor2000 = c(69, 50, 74, 52, 79, 50, 80, 80, 90), Poor2015 = c(61, 
    48, 73, 50, 73, 52, 78, 84, 82), Rich2000 = c(848, 311, 290, 
    270, 212, 180, 294, 143, 148), Rich2015 = c(1150, 391, 310, 
    299, 200, 198, 290, 151, 149)), row.names = c(NA, -9L), class = c("tbl_df", 
"tbl", "data.frame"))

Я хочу построить такой график:

enter image description here

На этом графике Я просто хочу показать ВВП на душу населения в беднейших регионах девяти стран в 2000 и 2015 годах (для удобства на предварительном рисунке три страны). Но я не знаю, как это сделать с помощью ggplot. Потому что кажется, что мне нужно установить ось x как «Страна» и ось y как «Poor2000» и «Poor2015» две переменные. Я не знаю, как это сделать. Большое спасибо заранее.

1 Ответ

3 голосов
/ 14 марта 2020

Здесь возможное решение. Начиная с вашего фрейма данных, вы можете сначала создать новый фрейм данных, который преобразует его в более длинный формат. Для этого я использовал функцию pivot_longer из пакета tidyr:

library(tidyr)
library(dplyr)
DF <- df %>% select(Country, Poor2000, Poor2015) %>%
  mutate(Diff = Poor2015 - Poor2000) %>%
  pivot_longer(-Country, names_to = "Poor", values_to = "value")

# A tibble: 27 x 3
   Country       Poor     value
   <fct>         <chr>    <dbl>
 1 Britain       Poor2000    69
 2 Britain       Poor2015    61
 3 Britain       Diff        -8
 4 Germany       Poor2000    50
 5 Germany       Poor2015    48
 6 Germany       Diff        -2
 7 United States Poor2000    74
 8 United States Poor2015    73
 9 United States Diff        -1
10 France        Poor2000    52
# … with 17 more rows

Мы также создадим второй кадр данных, который будет содержать разницу значений между Poor2000 и Poor2015:

DF_second_label <-  df %>% select(Country, Poor2000, Poor2015) %>%
  group_by(Country) %>% 
  mutate(Diff = Poor2015 - Poor2000, ypos = max(Poor2000,Poor2015))

# A tibble: 9 x 5
# Groups:   Country [9]
  Country       Poor2000 Poor2015  Diff  ypos
  <fct>            <dbl>    <dbl> <dbl> <dbl>
1 Britain             69       61    -8    69
2 Germany             50       48    -2    50
3 United States       74       73    -1    74
4 France              52       50    -2    52
5 South Korea         79       73    -6    79
6 Italy               50       52     2    52
7 Japan               80       78    -2    80
8 Spain               80       84     4    84
9 Sweden              90       82    -8    90

Затем мы можем построить оба новых кадра данных в ggplot2 и выбрать только интересующие страны с помощью функции subset:

ggplot(subset(DF, Poor != "Diff" & Country %in% c("Britain","South Korea","Sweden")), 
       aes(x = Country, y = value, fill = Poor))+
  geom_col(position = position_dodge())+
  geom_text(aes(label = value), position = position_dodge(0.9), vjust = -0.5, show.legend = FALSE)+
  geom_text(inherit.aes = FALSE, 
            data = subset(DF_second_label, Country %in% c("Britain","South Korea","Sweden")),
            aes(x = Country, 
                y = ypos+10,
                label = Diff), color = "darkgreen", size = 6, show.legend = FALSE)+
  labs(x = "", y = "GDP per Person", title = "Poor in 2000 & 2015")+
  theme(plot.title = element_text(hjust = 0.5))

И вы получите:

enter image description here


Воспроизводимый пример

df <- data.frame(Country = c("Britain","Germany", "United States", "France", "South Korea", "Italy","Japan","Spain","Sweden"),
                 Poor2000 = c(69,50,74,52,79,50,80,80,90),
                 Poor2015 = c(61,48,73,50,73,52,78,84,82),
                 Rich2000 = c(848,311,290,270,212,180,294,143,148))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...