从 ggplot 对象获取轴限制

mho*_*ovd 2 r ggplot2

有时我会制作两个相似但数据不同的图。因此,X 轴和 Y 轴将具有不同的范围。

library(ggplot2)
library(ggpubr)
#> Loading required package: magrittr
df1 <- data.frame(x=runif(10)*2,y = runif(10)*2)
df2 <- data.frame(x=runif(10)*3,y = runif(10)*1)
p1 <- qplot(x = x, y = y, data = df1, geom = "line")
p2 <- qplot(x = x, y = y, data = df2, geom = "line")

ggarrange(p1,p2)
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.3.0)于 2020 年 7 月 9 日创建

这可以通过使用xlim和显式声明范围来手动克服ylim,但这既令人厌烦,而且如果不小心可能会导致某些数据超出指定范围。

理想的解决方案是从 动态获取限制p1,如果这些限制大于的限制,则p2使用它们代替p2。例如p2 + xlim(getLimits(p1))

支持这样的东西吗?

编辑: 有人提出了这个问题,但答案似乎来自旧版本的ggplot2. 此外,受支持的p1$coordinates$limits仅返回手动指定的限制,这违背了目的。

eip*_*i10 5

ggplot 现在具有layer_***从 ggplots 中提取信息的便利功能。在这种情况下,您可以使用该layer_scales功能:

layer_scales(p1)$y$get_limits()

[1] 0.1499588 1.9527970
Run Code Online (Sandbox Code Playgroud)

所以你可以这样做:

library(tidyverse)
library(patchwork)
library(ggpubr)
theme_set(theme_bw())

set.seed(2)
df1 <- data.frame(x=runif(10)*2,y = runif(10)*2)
df2 <- data.frame(x=runif(10)*3,y = runif(10)*1)
p1 <- qplot(x = x, y = y, data = df1, geom = "line")
p2 <- qplot(x = x, y = y, data = df2, geom = "line")

fnc = function(...) {
  
  p = list(...)
  
  yr = map(p, ~layer_scales(.x)$y$get_limits()) %>% 
    unlist %>% range
  
  xr = map(p, ~layer_scales(.x)$x$get_limits()) %>% 
    unlist %>% range
  
  p %>% map(~.x + xlim(xr) + ylim(yr))
}

wrap_plots(fnc(p1, p2))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明