在 ggplot2 字幕的 plotmath 表达式中包含条件元素
including conditional elements in plotmath expression for ggplot2 subtitle
我正在尝试编写一个自定义函数,我想在 ggplot2
绘图副标题中显示效果大小估计及其置信区间。我正在使用 plotmath
来正确显示希腊字母和其他数学符号。
这就是我想要的两种字幕的样子-
为了实现这个,我写了一个简单的函数-
# set up
set.seed(123)
library(tidyverse)
library(cowplot)
# creating a fictional dataframe with effect size estimate and its confidence
# intervals
effsize_df <- tibble::tribble(
~estimate, ~conf.low, ~conf.high,
0.25, 0.10, 0.40
)
# function to prepare subtitle
subtitle_maker <- function(effsize_df, effsize.type) {
if (effsize.type == "p_eta") {
# preparing the subtitle
subtitle <-
# extracting the elements of the statistical object
base::substitute(
expr =
paste(
eta["p"]^2,
" = ",
effsize,
", 95% CI",
" [",
LL,
", ",
UL,
"]",
),
env = base::list(
effsize = effsize_df$estimate[1],
LL = effsize_df$conf.low[1],
UL = effsize_df$conf.high[1]
)
)
} else if (effsize.type == "p_omega") {
# preparing the subtitle
subtitle <-
# extracting the elements of the statistical object
base::substitute(
expr =
paste(
omega["p"]^2,
" = ",
effsize,
", 95% CI",
" [",
LL,
", ",
UL,
"]",
),
env = base::list(
effsize = effsize_df$estimate[1],
LL = effsize_df$conf.low[1],
UL = effsize_df$conf.high[1]
)
)
}
# return the subtitle
return(subtitle)
}
请注意,条件语句的代码仅在一行上有所不同:eta["p"]^2
(如果是 "p_eta"
)或 omega["p"]^2
(如果是 "p_omega"
)和其余代码相同。我想重构此代码 以避免重复。
我不能有条件地将 eta["p"]^2
和 omega["p"]^2
分配给函数 body 中的不同 object(比方说 effsize.text <- eta["p"]^2
),因为 R
会抱怨在环境中找不到 objects eta
和 omega
。
我该怎么做?
------------------------ post-script-------------------- --------------------
以下是用于创建上面显示的组合图的代码-
# creating and joining two plots (plot is shown above)
cowplot::plot_grid(
# plot 1
ggplot(mtcars, aes(x = wt, y = mpg)) + geom_blank() +
labs(
subtitle = subtitle_maker(effsize_df, "p_omega"),
title = "partial omega"
),
# plot 2
ggplot(mtcars, aes(x = wt, y = mpg)) + geom_blank() +
labs(
subtitle = subtitle_maker(effsize_df, "p_eta"),
title = "partial eta"
),
labels = c("(a)", "(b)"),
nrow = 1
)
这是一个 unicode 解决方案。我使用 dplyr
中的 case_when
让生活更轻松。
# function to prepare subtitle
subtitle_maker <- function(effsize_df, effsize.type) {
# preparing the subtitle
subtitle <-
# extracting the elements of the statistical object
base::substitute(
expr =
paste(
effsize_sym["p"]^2,
" = ",
effsize,
", 95% CI",
" [",
LL,
", ",
UL,
"]",
),
env = base::list(
effsize = effsize_df$estimate[1],
LL = effsize_df$conf.low[1],
UL = effsize_df$conf.high[1],
effsize_sym = case_when(
effsize.type == "p_eta" ~ "\U1D702",
effsize.type == "p_omega" ~ "\U1D714",
TRUE ~ NA_character_
)
)
)
# return the subtitle
return(subtitle)
}
quote 和 bquote 的组合可以提供帮助,
subtitle_maker <- function(d, type){
et <- if(type == 'a') quote(eta) else if(type == 'b') quote(omega)
bquote(.(et)['p']^2==.(d$x)~", 95% CI ["*.(d$y)*","*.(d$z)*"]")
}
d <- list(x=1,y=2,z=3)
grid::grid.newpage()
grid::grid.text(subtitle_maker(d,"a"), y=0.3)
grid::grid.text(subtitle_maker(d,"b"), y=0.7)
注意:或用 bquote 代替,这只是个人喜好
subtitle_maker <- function(effsize_df, effsize.type) {
effsize.text <- if (effsize.type == "p_eta") quote(eta["p"]) else
if (effsize.type == "p_omega") quote(omega["p"])
base::substitute(
expr =
paste(effsize.text^2,
" = ",
effsize,
", 95% CI",
" [",
LL,
", ",
UL,
"]",
),
env = base::list(effsize.text = effsize.text,
effsize = effsize_df$estimate[1],
LL = effsize_df$conf.low[1],
UL = effsize_df$conf.high[1]
)
)
}
我正在尝试编写一个自定义函数,我想在 ggplot2
绘图副标题中显示效果大小估计及其置信区间。我正在使用 plotmath
来正确显示希腊字母和其他数学符号。
这就是我想要的两种字幕的样子-
为了实现这个,我写了一个简单的函数-
# set up
set.seed(123)
library(tidyverse)
library(cowplot)
# creating a fictional dataframe with effect size estimate and its confidence
# intervals
effsize_df <- tibble::tribble(
~estimate, ~conf.low, ~conf.high,
0.25, 0.10, 0.40
)
# function to prepare subtitle
subtitle_maker <- function(effsize_df, effsize.type) {
if (effsize.type == "p_eta") {
# preparing the subtitle
subtitle <-
# extracting the elements of the statistical object
base::substitute(
expr =
paste(
eta["p"]^2,
" = ",
effsize,
", 95% CI",
" [",
LL,
", ",
UL,
"]",
),
env = base::list(
effsize = effsize_df$estimate[1],
LL = effsize_df$conf.low[1],
UL = effsize_df$conf.high[1]
)
)
} else if (effsize.type == "p_omega") {
# preparing the subtitle
subtitle <-
# extracting the elements of the statistical object
base::substitute(
expr =
paste(
omega["p"]^2,
" = ",
effsize,
", 95% CI",
" [",
LL,
", ",
UL,
"]",
),
env = base::list(
effsize = effsize_df$estimate[1],
LL = effsize_df$conf.low[1],
UL = effsize_df$conf.high[1]
)
)
}
# return the subtitle
return(subtitle)
}
请注意,条件语句的代码仅在一行上有所不同:eta["p"]^2
(如果是 "p_eta"
)或 omega["p"]^2
(如果是 "p_omega"
)和其余代码相同。我想重构此代码 以避免重复。
我不能有条件地将 eta["p"]^2
和 omega["p"]^2
分配给函数 body 中的不同 object(比方说 effsize.text <- eta["p"]^2
),因为 R
会抱怨在环境中找不到 objects eta
和 omega
。
我该怎么做?
------------------------ post-script-------------------- --------------------
以下是用于创建上面显示的组合图的代码-
# creating and joining two plots (plot is shown above)
cowplot::plot_grid(
# plot 1
ggplot(mtcars, aes(x = wt, y = mpg)) + geom_blank() +
labs(
subtitle = subtitle_maker(effsize_df, "p_omega"),
title = "partial omega"
),
# plot 2
ggplot(mtcars, aes(x = wt, y = mpg)) + geom_blank() +
labs(
subtitle = subtitle_maker(effsize_df, "p_eta"),
title = "partial eta"
),
labels = c("(a)", "(b)"),
nrow = 1
)
这是一个 unicode 解决方案。我使用 dplyr
中的 case_when
让生活更轻松。
# function to prepare subtitle
subtitle_maker <- function(effsize_df, effsize.type) {
# preparing the subtitle
subtitle <-
# extracting the elements of the statistical object
base::substitute(
expr =
paste(
effsize_sym["p"]^2,
" = ",
effsize,
", 95% CI",
" [",
LL,
", ",
UL,
"]",
),
env = base::list(
effsize = effsize_df$estimate[1],
LL = effsize_df$conf.low[1],
UL = effsize_df$conf.high[1],
effsize_sym = case_when(
effsize.type == "p_eta" ~ "\U1D702",
effsize.type == "p_omega" ~ "\U1D714",
TRUE ~ NA_character_
)
)
)
# return the subtitle
return(subtitle)
}
quote 和 bquote 的组合可以提供帮助,
subtitle_maker <- function(d, type){
et <- if(type == 'a') quote(eta) else if(type == 'b') quote(omega)
bquote(.(et)['p']^2==.(d$x)~", 95% CI ["*.(d$y)*","*.(d$z)*"]")
}
d <- list(x=1,y=2,z=3)
grid::grid.newpage()
grid::grid.text(subtitle_maker(d,"a"), y=0.3)
grid::grid.text(subtitle_maker(d,"b"), y=0.7)
注意:或用 bquote 代替,这只是个人喜好
subtitle_maker <- function(effsize_df, effsize.type) {
effsize.text <- if (effsize.type == "p_eta") quote(eta["p"]) else
if (effsize.type == "p_omega") quote(omega["p"])
base::substitute(
expr =
paste(effsize.text^2,
" = ",
effsize,
", 95% CI",
" [",
LL,
", ",
UL,
"]",
),
env = base::list(effsize.text = effsize.text,
effsize = effsize_df$estimate[1],
LL = effsize_df$conf.low[1],
UL = effsize_df$conf.high[1]
)
)
}