ggplot2中的分轴图

Posted

技术标签:

【中文标题】ggplot2中的分轴图【英文标题】:Split axis plot in ggplot2 【发布时间】:2020-10-10 03:09:17 【问题描述】:

我刚刚在 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 刻度的图中看到的那样。我想知道方面是否会是更好的方法。我也不确定点大小是否计算错误,因为我先过滤数据。

【问题讨论】:

【参考方案1】:

这是一个使用构面的解决方案。您可以通过使用 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())

【讨论】:

这是一个不错的方法,实际上将其放入为您计算中断并正确划分数据图的函数中更简单(这是我的最终意图)。

以上是关于ggplot2中的分轴图的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2包绘制双坐标轴图(双Y轴图)实战:两个Y轴分别使用不同的刻度范围

ggplot2副轴奇怪的输出

R语言ggplot2可视化分面图(faceting): ggplot2可视化分面图(facet_wrap)并设置不同的分面使用不同的坐标轴数值范围以及不同的轴标签断点间隔breaks

R语言ggplot2可视化绘制带有双y轴(double y axis)的分面图(facetfacet_grid)

R语言ggplot2可视化分面图(faceting): 堆叠柱状图的分面图编写自定义函数在分面图的左侧添加图例信息(legend)

R语言ggplot2可视化:为不同的分面图添加不同的geom_vline和geom_hline为不同的分组数据添加不同的横线竖线