【发布时间】:2017-12-13 17:13:23
【问题描述】:
我正在尝试编写一个可以使用基于 '+' 的 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 上的图
有什么想法吗?
【问题讨论】:
-
抱歉,ggplot 出现在管道之前。
%>%运算符与+运算符非常非常不同。您不能将行为包装在您的函数中。最好只是把它吸起来并使用括号:(a+b) %>% c。 -
同意。或
ylim_sym <- function(y) { ylim(-max(abs(y)), max(abs(y))) }至少为了方便起见。