使用“rlang”在“ggplot”中使用“ggrepel”进行条件标记`
我正在编写一个自定义函数来创建带有标签的散点图。这里是一个相同的最低版本使用“rlang”在“ggplot”中使用“ggrepel”进行条件标记`,r,ggplot2,rlang,ggrepel,R,Ggplot2,Rlang,Ggrepel,我正在编写一个自定义函数来创建带有标签的散点图。这里是一个相同的最低版本 #所需的库 图书馆(tidyverse) 图书馆(GG2) 图书馆(ggrepel) #自定义函数 标签加法器5 重量25英里 等等 我可以使用rlang对geom\u label\u repel的代码进行哪些更改,以便对用户提供的任何条件(包括x和/或y)进行评估,并且只有这些标签才会显示在绘图中?您可以尝试类似的方法。在这里,我向函数添加一个表达式参数,检查表达式是否正在使用,然后进行相应的过滤 library(ti
#所需的库
图书馆(tidyverse)
图书馆(GG2)
图书馆(ggrepel)
#自定义函数
标签加法器5
重量<4英里/加仑<20英里
重量>4英里/加仑>25英里
等等
我可以使用
rlang
对geom\u label\u repel
的代码进行哪些更改,以便对用户提供的任何条件(包括x
和/或y
)进行评估,并且只有这些标签才会显示在绘图中?您可以尝试类似的方法。在这里,我向函数添加一个表达式参数,检查表达式是否正在使用,然后进行相应的过滤
library(tidyverse)
library(ggplot2)
library(ggrepel)
# custom function
label_adder <- function(data, x, y, label.var, exp = NULL) {
param_list <- as.list(match.call())
if("exp" %in% names(param_list)){
plot <-
ggplot(
mapping = aes(
x = !!rlang::enquo(x),
y = !!rlang::enquo(y)
)) +
geom_point(data = data) +
geom_smooth(data = data, method = "lm")+
geom_label_repel(data = data %>% filter(!!rlang::enquo(exp)),
mapping = aes(label = !!rlang::enquo(label.var)))
return(plot)
}
else{
plot <-
ggplot(data = data,
mapping = aes(
x = !!rlang::enquo(x),
y = !!rlang::enquo(y)
)) +
geom_point() +
geom_smooth(method = "lm")+
geom_label_repel(mapping = aes(label = !!rlang::enquo(label.var)))
return(plot)
}
}
# creating dataframe
mtcars_new <- mtcars %>%
tibble::rownames_to_column(., var = "car") %>%
tibble::as_data_frame(x = .)
# using the function
label_adder(
data = mtcars_new,
x = wt,
y = mpg,
label.var = car
)
库(tidyverse)
图书馆(GG2)
图书馆(ggrepel)
#自定义函数
谢谢。我想知道是否有可能避免if-else
。也就是说,无论exp
参数是否为NULL
,函数都将工作。我给出的例子非常简单,所以这看起来没什么大不了的,但我的实际函数很大,包含if-else
会使它更加复杂。不,我完全理解这一点。我发现这是一个普遍的问题。让我想一想,并想出另一个解决方案。我更新了一个小调整的空间。请注意,如果函数的脚本很长。您可以为大函数的每个部分编写单独的函数,然后让大函数调用单个小函数。我发现这有助于消除冗长函数的混乱为了避免冗长的if-else语句,您需要有一个包含所有数据的默认“过滤器”。行号>0包含所有数据我在此处发布了一个新问题:
label_adder(
data = mtcars_new,
x = wt,
y = mpg,
label.var = car,
exp = wt < 4 & mpg < 20
)
label_adder <- function(data, x, y, label.var, exp = NULL) {
param_list <- as.list(match.call())
if("exp" %in% names(param_list)){
my_exp <- rlang::enquo(exp)
}
else{
a <- "row_number() > 0"
my_exp <- rlang::quo(!! rlang::sym(a))
}
plot <-
ggplot(
mapping = aes(
x = !!rlang::enquo(x),
y = !!rlang::enquo(y)
)) +
geom_point(data = data) +
geom_smooth(data = data, method = "lm")+
geom_label_repel(data = data %>% filter(!!my_exp),
mapping = aes(label = !!rlang::enquo(label.var)))
return(plot)
}