Что означает функциональность "non_missing_aes" в ggproto ggplot2?
Я пишу расширения для ggplot2
и обнаружил, что есть недавно добавленный non_missing_aes
параметр в ggproto
это не было объяснено в официальных документах ggplot2
и официальное руководство по продлению ggplot2
Может кто-нибудь сказать мне его функциональность, и разницу между required_aes
? Спасибо!
0 ответов
TLDR
require_aes
определяет эстетические отображения, которые должны существовать, прежде чем все в geom_*()
или же stat_*()
передается в объект ggproto, в то время как non_missing_aes
определяет эстетические отображения, которые должны существовать после необходимых этапов обработки различными функциями, определенными в упомянутом объекте ggproto.
Более длинное объяснение
Поскольку вы пишете расширения, я предполагаю, что вы знакомы с тем, как фрейм данных передается в ggplot()
и наследуется каждым соответствующим слоем (или передается непосредственно в каждый слой), затем передается в соответствующие объекты ggproto Geom / Stat и преобразуется по пути.
non_missing_aes
, вместе с required_aes
, упоминается как часть этого процесса преобразования данных, в Geom$handle_na
также как и Stat$compute_layer
функции, от которых все остальные Geoms & Stats наследуют по умолчанию.
Более конкретно, non_missing_aes
находится в пределах remove_missing
функционировать следующим образом (я добавил имена аргументов функции ниже для ясности):
remove_missing(df = data,
na.rm = params$na.rm,
vars = c(self$required_aes, self$non_missing_aes),
name = snake_class(self))
Из ?remove_missing
, мы можем сказать, что это где все столбцы, перечисленные в require_aes
или же non_missing_aes
проверяются, и строки с пропущенными значениями в любом из проверенных столбцов удаляются из фрейма данных.
Но зачем использовать non_missing_aes
? Почему бы не указать все такие столбцы в require_aes
? Посмотрите на некоторые Geoms / Stats, которые на самом деле что-то указывают в non_missing_aes
предполагает почему:
GeomBar (комментарии ниже взяты из реального кода, найденного на GitHub):
required_aes = c("x", "y"),
# These aes columns are created by setup_data(). They need to be listed here so
# that GeomRect$handle_na() properly removes any bars that fall outside the defined
# limits, not just those for which x and y are outside the limits
non_missing_aes = c("xmin", "xmax", "ymin", "ymax"),
...
required_aes = c("x", "y"),
non_missing_aes = "fill",
default_aes = aes(fill = "grey20", alpha = NA),
...
required_aes = c("x", "y", "xend", "yend"),
non_missing_aes = c("linetype", "size", "shape"),
default_aes = aes(colour = "black", size = 0.5, linetype = 1, alpha = NA),
...
required_aes = c("x", "y"),
non_missing_aes = c("size", "shape", "colour"),
default_aes = aes(shape = 19, colour = "black", size = 1.5, fill = NA,
alpha = NA, stroke = 0.5),
...
StatYdensity (обратите внимание, что этот Stat обычно используется с geom_violin
, который указывает weight = 1
в его default_aes
):
required_aes = c("x", "y"),
non_missing_aes = "weight",
...
В каждом случае эстетические сопоставления, перечисленные в non_missing_aes
это те, которые НЕ обязательно указываются пользователем в момент создания объекта ggplot, поэтому соответствующие столбцы могут не существовать во фрейме данных с самого начала.
Для GeomBar столбцы xmin / xmax / ymin / ymax рассчитываются только из заданного фрейма данных во время GeomBar$setup_data()
, В остальном non_missing_aes
отображения включены в их соответствующие Geoms default_aes
, так что пока они могут существовать с самого начала, если пользователь включит что-то вроде colour = <some variable in the data>
в geom_*()
в противном случае столбцы будут созданы на более позднем этапе и заполнены значениями по умолчанию.
В любом случае, к тому времени, когда кадр данных оценивается remove_missing
функция, все столбцы в любом required_aes
или же non_missing_aes
должен присутствовать, но так как не все были введены пользователем с самого начала, мы не можем указать их все в required_aes
потому что любое эстетическое отображение перечислено в required_aes
но не присутствует в geom_*()
/ stat_*()
вызовет ошибку:
Ошибка: geom_* требует следующую отсутствующую эстетику: some_aes_or_other