Использование `rlang` для условной маркировки в`ggplot` с использованием `ggrepel`
Я пишу пользовательскую функцию для создания диаграммы рассеяния с метками, прикрепленными к точкам. Вот минимальное исполнение того же.
# needed libraries
library(tidyverse)
library(ggplot2)
library(ggrepel)
# custom function
label_adder <- function(data, x, y, label.var) {
# basic plot
plot <-
ggplot(data = data,
mapping = aes(
x = !!rlang::enquo(x),
y = !!rlang::enquo(y)
)) +
geom_point() +
geom_smooth(method = "lm")
# adding label
plot <-
plot +
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
)
Создано 2018-08-30 пакетом представлением (v0.2.0.9000).
Вопрос: Кажется, я не могу понять, как я могу сделать маркировку зависимой от значений x
а также y
переменные. Например, скажем, пользователь хочет отображать не все точки на диаграмме рассеяния, а только точки с (примеры):
wt > 5
wt < 4 & mpg < 20
wt > 4 | mpg > 25
и т.п.
Что я могу изменить в коде для geom_label_repel
с помощью rlang
так что любое условие, которое предоставляет пользователь (включая x
и / или y
) будет оцениваться и только те метки будут отображаться на графике?
1 ответ
Вы можете попробовать что-то вроде этого. Здесь я добавляю аргумент выражения к вашей функции, проверяю, используется ли выражение, а затем фильтрую соответственно.
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
)
label_adder(
data = mtcars_new,
x = wt,
y = mpg,
label.var = car,
exp = wt < 4 & mpg < 20
)
Создано 2018-08-30 пакетом представлением (v0.2.0).
Обновить
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)
}
Это все еще использует if
а также else
, но не требует весь дополнительный код, как указано выше.