Что означает функциональность "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"),
...

GeomRaster:

required_aes = c("x", "y"),
non_missing_aes = "fill",
default_aes = aes(fill = "grey20", alpha = NA),
...

GeomSegment:

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),
...

GeomPoint:

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

Другие вопросы по тегам