[英]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.