Я пытаюсь создать настраиваемую функцию статистики с помощью ggplot2, в которой я хотел бы получить доступ к дискретной переменной для вычисления статистики для каждой группы. Однако по умолчанию уровни ggplot автоматически назначают неявные группы любым дискретным переменным (в основном). Это означает, что мои данные разделяются на автоматическую группировку, чего я бы не хотел.
Я могу показать это следующим образом; У меня довольно стандартный конструктор:
library(ggplot2)
stat_example <- function(
mapping = NULL,
data = NULL,
geom = "point",
position = "identity",
...,
na.rm = FALSE,
show.legend = NA,
inherit.aes = TRUE
) {
layer(data = data,
mapping = mapping,
stat = StatExample,
geom = geom,
position = position,
show.legend = show.legend,
inherit.aes = inherit.aes,
params = list(na.rm = na.rm))
}
И у меня есть объект Stat ggproto, который просто передает данные, но печатает заголовок данных в иллюстративных целях. Я назвал здесь бит, который меня интересует для вычисления фактической статистики value
.
StatExample <- ggproto(
"StatExample",
Stat,
required_aes = c("x", "y", "value"),
default_aes = aes(x = after_stat(x), y = after_stat(y)),
compute_group = function(data, scales) {
print(head(data, 2))
data
}
)
Теперь, если я построю график с этим показателем, мы увидим, что входит в функцию compute_group()
как data
.
g <- ggplot(iris) +
stat_example(aes(Sepal.Width, Sepal.Length, value = Species))
# To get only the print side-effect, not the plot (which looks normal)
g <- ggplotGrob(g)
#> x y value PANEL group
#> 1 3.5 5.1 setosa 1 1
#> 2 3.0 4.9 setosa 1 1
#> x y value PANEL group
#> 51 3.2 7.0 versicolor 1 2
#> 52 3.2 6.4 versicolor 1 2
#> x y value PANEL group
#> 101 3.3 6.3 virginica 1 3
#> 102 2.7 5.8 virginica 1 3
Создано 28 мая 2020 г. пакетом REPEX (v0.3.0)
Я хотел бы иметь 1 data.frame, содержащий все данные для этого случая. Выше мы видим, что мы распечатали 3 кадра data.frames с разными group
переменными, что означает, что данные были разделены на 3 группы. Я думаю, что для этого нужно, чтобы переменная value
избежала автоматического определения группы.
Я учел следующие моменты:
- Я мог бы позволить группе по умолчанию
-1
, которая является стандартной группой без группы. Однако, когда я это сделаю, данные не будут автоматически сгруппированы, например,aes(colour = some_variable)
. Я хочу, чтобы это произошло окончательно. - Глядя на функцию
ggplot2:::add_group()
, кажется, что я могу избежать автогруппировки, назвав моюvalue
переменнуюlabel
, однако это сделало бы статистику несовместимой сgeom_text()
, и она не описывает значениеvalue
естественным образом. - Я мог бы заменить вызов
layer()
вариантом этой функции, который создал бы другой объект Layer ggproto, в которомcompute_aesthetics()
по-разному работает с группами. Однако это большая работа, которую я предпочел бы избежать. - Я, вероятно, мог бы проделать трюк в духе
vctrs::new_vctr(..., class = "not_discrete")
, но где подходящее место, чтобы обернуть моюvalue
переменную в этом классе?
Приветствуются полезные предложения или новые варианты аргументов типа «просто используйте label
».
param
, а не какaes
? - person tjebo   schedule 30.06.2020