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