r语言 - 如何编写可以引用输入图的 ggplot '+' 管道函数



我正在尝试编写一个可以使用' ' - 基于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绘图

有什么想法?

我能够通过以下内容解决它。

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

相关内容

  • 没有找到相关文章

最新更新