Разделить график оси в ggplot2 - PullRequest
4 голосов
/ 19 июня 2020

Я только что нашел этот сюжет в «Фактичности» (книга Ганса Рослинга и его детей). Мне очень нравится эстетика сплита.

enter image description here

Хотя можно сделать нечто подобное, используя geom_rect(), это совсем другой вид. Другой подход - использовать cowplot или patchwork, но довольно сложный. Вот насколько я пытался воспроизвести верхнюю часть с помощью

gapminder %>% 
  filter(year==1997, gdpPercap<16000) %>%
  ggplot(aes(gdpPercap, y=lifeExp, size=pop)) +
  geom_point(alpha=0.5)+
  scale_x_log10()+
  ggthemes::theme_base()+
  theme(legend.position = "none",
        plot.background = element_blank(),
        plot.margin = unit(c(0.5, 0, 0, 0), "cm")) -> P1

gapminder %>% 
  filter(year==1997, gdpPercap>16000) %>%
  ggplot(aes(gdpPercap, y=lifeExp, size=pop)) +
  geom_point(alpha=0.5)+
  scale_x_log10()+
  ggthemes::theme_base()+
  theme(legend.position = "none",
        axis.title.y = element_blank(),
        axis.ticks.y = element_blank(),
        axis.text.y = element_blank(),
        plot.background = element_blank(),
        plot.margin = unit(c(0.5, 0.5, 0, 0), "cm"),
        axis.title.x = element_blank()) -> P2

cowplot::plot_grid(P1, P2, rel_widths = c(2,1), labels = NULL,
                   align = "h")

enter image description here

Я думаю, что весь остальной текст и основные моменты возможны с существующие пакеты. Мне интересно, как получить общую ось x (правая сторона должна отображать галочки в соответствии с). В идеале заголовок оси x должен располагаться по центру, но это может быть слишком много. Я также могу переместить его внутрь как текст.

Есть проблемы с осями, как вы можете видеть на графике с отметками y. Интересно, было бы лучше использовать аспекты. Я также не уверен, неправильно ли рассчитан размер в пунктах, потому что я сначала фильтрую данные.

enter image description here

1 Ответ

4 голосов
/ 19 июня 2020

Вот решение с использованием фасетов. Вы можете решить проблему разрывов по оси X, предварительно вычислив разрывы с помощью калькулятора log10 пакета scale. Вы можете использовать mutate() в конвейере, чтобы создать новую переменную, которая разделяет фасеты.

library(tidyverse)
library(gapminder)

breaks <- scales::log10_trans()$breaks(range(gapminder$gdpPercap), n = 6)

gapminder %>% 
  filter(year==1997) %>%
  mutate(facet = factor(ifelse(gdpPercap > 16000, "High", "Low"),
                        levels = c("Low", "High"))) %>%
  ggplot(aes(gdpPercap, y=lifeExp, size=pop)) +
  geom_point(alpha=0.5)+
  scale_x_log10(breaks = breaks)+
  ggthemes::theme_base()+
  facet_grid(~ facet, 
             scales = "free_x", space = "free_x") +
  ggtitle("My title") +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0.5),
        plot.background = element_blank())

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...