首页 > 解决方案 > 从 ggplot 对象获取轴限制

问题描述

有时我会制作两个相似但数据不同的图。因此,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)

reprex 包于 2020-07-09 创建(v0.3.0)

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

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

支持这样的东西吗?

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

标签: rggplot2

解决方案


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

layer_scales(p1)$y$get_limits()

[1] 0.1499588 1.9527970

因此,您可以执行以下操作:

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

在此处输入图像描述


推荐阅读