Я хочу добавить дополнительную информацию в метки граней графика ggplot из данных, на которых построен график. По разным причинам я пытаюсь сделать это постфактум, вместо того, чтобы полагаться на специальные изменения данных.
Я попытался смоделировать свою функцию маркировки на основе label_wrap_gen
, думая, что с тем же успехом я мог бы добавить переменную фрейма данных в качестве параметра функции, а не просто фиксированное число, которое принимает label_wrap_gen
.
Однако это не работает, как ожидалось. Вместо искомой "4 (5)" в крайней левой грани у меня получается "4 ()". Проблема, кажется, в том, что app_n
не получает фактические данные или что-то в этом роде. Если вместо .data$en
(ниже) использовать только en
, я получаю сообщение об ошибке для переменной, которая не найдена.
app_n <- function(.n) {
fun <- function(labels) {
labels <- label_value(labels, multi_line = TRUE)
lapply(labels, function(x) {
x <- paste0(x, '(', .n, ')')
vapply(x, paste, character(1), collapse = "\n")
})
}
structure(fun, class = 'labeller')
}
mtcars %>%
group_by(cyl) %>%
mutate(en = 5) %>%
ggplot(aes(drat, wt)) +
facet_wrap(~ cyl, labeller = app_n(.n = .data$en))
Причина, по которой я выбираю этот путь, заключается в том, что в моем реальном приложении я пытаюсь добавить размер выборки к метке фасета и по таким причинам, как «я хочу узнать, возможно ли это», а также «код уже сложный». достаточно" Я впервые пытаюсь пойти по этому пути.
Это вообще может работать? (да, я знаю, что это может привести к вставке вектора в виде текста. Хотя это не сработает для моего реального сюжета, на данном этапе я был бы рад получить такой результат)
Можно передать столбец en
вашей функции маркировки, изменив .data
на .
и используя {}
, чтобы сообщить конвейеру, что есть два аргумента данных.
mtcars %>%
group_by(cyl) %>%
mutate(en = 5) %>%
{ggplot(., aes(drat, wt)) +
facet_wrap(~ cyl, labeller = app_n(.n = .$en))}
Это возвращает ожидаемые метки.
Однако использование самой переменной фрейма данных для маркировки фасетов подразумевает, что фасетов столько же, сколько строк. В противном случае используются только первые несколько меток и возвращается предупреждение.
О, я совсем забыл про точечный вариант! Спасибо за напоминание. Действительно, как только это сработает, я также уже ожидаю, что это не будет работать должным образом из-за несоответствия граней и строк, о котором вы упоминаете. Теперь я хотя бы знаю, как заставить его работать :)