ggplot2中的拆分轴图

Split axis plot in ggplot2

我刚刚在 Factfulness(汉斯罗斯林和他的 children 的书)中找到了这个情节。我发现分裂的美学非常吸引人。

虽然可以使用 geom_rect() 制作类似的东西,但外观完全不同。另一种方法是使用 cowplotpatchwork 但非常棘手。这是我尝试用

复制顶部的部分
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")

我认为其余的文本和亮点都可以使用现有的软件包。我想知道获得公共 x 轴的方法是什么(右侧应该根据 显示刻度)。理想情况下,x 轴标题应该居中,但这可能要求太高。我也可以将它作为文本移动到里面。

轴有问题,正如您在带有 y 刻度的图中看到的那样。我想知道 facets 是否是更好的方法。我也不确定点大小是否计算错误,因为我先过滤了数据。

这是一个使用分面的解决方案。您可以通过使用 scale 包的 log10 中断计算器预先计算中断来解决 x 轴中断问题。您可以在管道中使用 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())