首页 > 解决方案 > ggplot2中的分轴图

问题描述

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

在此处输入图像描述

虽然使用 可以制作类似的东西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 刻度的图中看到的那样。我想知道方面是否会是更好的方法。我也不确定点大小是否计算错误,因为我先过滤数据。

在此处输入图像描述

标签: rggplot2cowplot

解决方案


这是使用方面的解决方案。scale您可以通过使用包的 log10 中断计算器预先计算中断来解决 x 轴中断问题。您可以mutate()在管道中使用 a 来创建一个拆分方面的新变量。

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())

在此处输入图像描述


推荐阅读