ggplot2中的拆分轴图
Split axis plot in ggplot2
我刚刚在 Factfulness(汉斯罗斯林和他的 children 的书)中找到了这个情节。我发现分裂的美学非常吸引人。
虽然可以使用 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")
我认为其余的文本和亮点都可以使用现有的软件包。我想知道获得公共 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())
我刚刚在 Factfulness(汉斯罗斯林和他的 children 的书)中找到了这个情节。我发现分裂的美学非常吸引人。
虽然可以使用 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")
我认为其余的文本和亮点都可以使用现有的软件包。我想知道获得公共 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())