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