【问题标题】:Get axis limits from ggplot object [duplicate]从ggplot对象获取轴限制[重复]
【发布时间】:2020-07-09 15:50:13
【问题描述】:

有时我会制作两个相似但数据不同的图。 因此,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 package (v0.3.0) 于 2020-07-09 创建

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

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

支持这样的东西吗?

编辑: 建议使用This question,但答案适用于旧版本的ggplot2。此外,受支持的p1$coordinates$limits 仅返回手动指定的限制,这与目的不符。

【问题讨论】:

  • 我看了看,但我无法使用coordinates$limits 对象或其他建议的对象来获得限制。它似乎是ggplot2 的旧版本。此外,p1$coordinates$limits 仅返回使用 xlim 等指定的限制。
  • The second answer 在那个重复的问题中包括较新的 layer_scales 函数,而第三个讨论了 ggplot_build 选项,我认为这两者都应该做你想做的事

标签: r ggplot2


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    只画一张图而不是两张:

    library(dplyr)
    library(ggplot2)
    
    # 1. create datasets
    df1 <- data.frame(x=runif(10)*2, y = runif(10)*2)
    df2 <- data.frame(x=runif(10)*3, y = runif(10)*1)
    
    
    # 2. union datasets and plot
    df1 %>% 
      mutate(dataset_name = "Dataframe #1") %>% 
      bind_rows(df2 %>% mutate(dataset_name = "Dataframe #2")) %>% 
    
      ggplot(aes(x = x, y = y)) +
        geom_line() +
        facet_grid(~ dataset_name)
    

    【讨论】:

    • 这假设数据是可绑定的,例如没有唯一的列(可以过滤掉,但肯定会使过程复杂化)。
    • 为什么? dplyr::bind_rows 不要求合并的日期帧包含相同数量或名称的列。
    • 我的立场是正确的 - 我认为它只是 rbind 的包装器,但我对其进行了测试,它似乎有效!
    【解决方案3】:

    听起来您正在寻找ggplot_build()?该函数的输出包括一个面板对象,其中包含轴限制。你可以阅读更多关于它的信息here。这是为了获取面板对象:

    panel1 <- ggplot_build(p1)$panel
    panel2 <- ggplot_build(p2)$panel
    

    然后您可以从那里提取 x 和 y 的范围。确切的细节取决于您的 ggplot2 安装版本。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2018-08-04
      • 2021-03-06
      • 1970-01-01
      • 2015-03-27
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多