簡體   English   中英

如何編寫可以參考輸入圖的ggplot'+'可傳遞函數

[英]How to write a ggplot '+'-pipeable function that can refer to the input plot

我正在嘗試編寫一個可以使用基於'+'的ggplot2語法調用的函數。

myplot + myfunction

具體來說,我正在編寫的函數將y軸對稱為零,因此它需要確定輸入圖的y軸范圍。

所以讓,

ylim_sym <- function(p){
    get_y_range <- function(p){
        ggplot2::ggplot_build(p)$layout$panel_ranges[[1]]$y.range
        }
    max_offset <- max(abs(get_y_range(p)))
    p + ylim(- max_offset, max_offset)
}

使用此功能,可以進行以下工作:

qplot(x = 1:10, y = exp(rnorm(10))) %>% ylim_sym()

但這是行不通的,因為+.gg%>%之間存在某些優先級問題:

qplot(x = 1:10, y = exp(rnorm(10))) +
    geom_abline(slope = 0) %>%
    ylim_sym()

(我可以寫后者(all_my_ggplot_pipeline) %>% ylim_sym()但這是非常丑陋的語法)。

理想情況下,我希望能夠編寫ylim_sym以便可以像這樣通過管道進行傳輸,

qplot(x = 1:10, y = exp(rnorm(10))) + ylim_sym()

但我不知道如何在ylim_sym訪問+的LHS上的ylim_sym

有任何想法嗎?

通過執行以下操作,我能夠解決該問題。

StatSymYLim <- ggproto(
  "StatSymYLim", Stat, 
  compute_group = function(data, scales) {
    out <- data.frame(
      x = median(data$x),
      y = c(-1, 1) * max(abs(data$y))
      )
    out
    },
    required_aes = c("x", "y")
  )

ylim_sym <- function(...){
  geom_blank(..., stat = StatSymYLim)
  }

然后,根據需要執行以下操作:

qplot(x = 1:10, y = exp(rnorm(10))) +
  geom_abline(slope = 0) +
  ylim_sym()

我對ggplot2內部的理解很不公平,所以這可能是一個幼稚的解決方案。

注意:您的函數需要更新,因為對象的結構略有變化

使用ggfun軟件包可以正常工作:

# devtools::install_github("moodymudskipper/ggfun")
library(ggfun)

ylim_sym <- function(p){
  get_y_range <- function(p){
    ggplot2::ggplot_build(p)$layout$panel_params[[1]]$y.range
  }
  max_offset <- max(abs(get_y_range(p)))
  p + ylim(- max_offset, max_offset)
}

qplot(x = 1:10, y = exp(rnorm(10))) +
  geom_abline(slope = 0) +
  ylim_sym

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM