Я пытаюсь использовать geom_text для обозначения точек на графике qq в ggplot2. Я следую документации эстетической оценки Используя функцию after_stat. Вычисленные статистические данные помечены как теоретические, а образец, как показано в документации, в числе geom_qq вычисляемых переменных и должен быть доступен для использования в geom_text? Я впервые использую after_stat, поэтому не знаю, что делаю не так.
Вот пример того, что я пытался:
library(ggplot2)
dat <- iris
dat$row <- 1:nrow(dat)
dat |>
ggplot(aes(sample = Petal.Length)) +
geom_qq() +
geom_qq_line() +
geom_text(aes(label = row,
x = after_stat(theoretical),
y = after_stat(sample))) #Trying to label points on qq plot
#> Error in `geom_text()`:
#> ! Problem while mapping stat to aesthetics.
#> ℹ Error occurred in the 3rd layer.
Также попробовал этот способ изменить вместо geom_qq сделать geom_text
dat |>
ggplot(aes(sample = Petal.Length, label = row)) +
geom_qq(geom = "text") +
geom_qq_line()
#> Warning: The following aesthetics were dropped during statistical transformation: label.
#> ℹ This can happen when ggplot fails to infer the correct grouping structure in
#> the data.
#> ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
#> variable into a factor?
#> Warning: The following aesthetics were dropped during statistical transformation: label.
#> ℹ This can happen when ggplot fails to infer the correct grouping structure in
#> the data.
#> ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
#> variable into a factor?
#> Error in `geom_qq()`:
#> ! Problem while setting up geom.
#> ℹ Error occurred in the 1st layer.
#> Caused by error in `compute_geom_1()`:
#> ! `geom_text()` requires the following missing aesthetics: label.
Интересно на примере этой функциональности ggplot(faithful, aes(x = waiting)) + geom_histogram(aes(y = after_stat(density))) + geom_density() они не настраивают параметр stat. Я создал выпуск на github: github.com/tidyverse/ggplot2/issues/5794 потому что мне кажется, что он глючный.
Это потому, что geom_histogram по умолчанию имеет stat = "bin", который вычисляет плотность.
Тем временем я вычисляю квантили непосредственно во фрейме данных и использую geom_point и geom_label напрямую, вместо того, чтобы полагаться на qq геометрию.
Да, это похоже на правильный подход.
В будущем, когда вы опубликуете подобную проблему на GitHub, будет вежливо дать ссылку на сообщение stackoverflow, чтобы разработчикам ggplot2 не приходилось тратить время на рассказы вам о вещах, на которые уже указывалось здесь, на SO.





Как уже упоминалось @Axeman, вам также необходимо использовать stat = "qq" в geom_text, чтобы добавлять метки в ваш qqplot на основе значений sample и theoretical.
Однако, как правило, статистика преобразует исходный набор данных, а некоторые эстетические элементы вообще теряются, например stat = "qq" понимает или поддерживает только x, y, group и sample и, следовательно, вся остальная эстетика отбрасывается перед статистическим преобразованием. Как следствие, aes label= удаляется, а это означает, что в преобразованных данных больше нет столбца label (то же самое произойдет, если вы хотите использовать aes color, например, для цвета по Species). И, следовательно, мы получаем ошибку, поскольку geom_text требует label= aes.
Вместо этого одним из вариантов пометки ваших точек на основе столбца row исходных данных при использовании stat = "qq" будет упорядочить столбец row по Petal.Length, то есть переменной, сопоставленной с sample, и сопоставить переупорядоченный столбец с label aes с помощью after_stat, т. е. использовать after_stat(dat$row[order(dat$Petal.Length)]):
library(ggplot2)
dat <- iris
dat$row <- 1:nrow(dat)
dat |>
ggplot(aes(sample = Petal.Length)) +
geom_qq() +
geom_qq_line() +
geom_text(aes(
label = after_stat(
dat$row[order(dat$Petal.Length)]
),
x = after_stat(theoretical),
y = after_stat(sample + 1)
), stat = "qq", vjust = 0)

Почему вы ставите +1 по оси Y?
Извини. Это было просто для того, чтобы сдвинуть ярлыки. Надо было это упомянуть.
Ошибки, которые вы получаете, связаны с тем, что вы можете получить доступ к этим переменным только с помощью
after_stat(), если вы действительно используете этоstatв своемgeom. Значит, это должно выглядеть примерно такgeom_text(aes(x = after_stat(theoretical), y = after_stat(sample), label = row), stat = 'qq'). Однако и это не работает, потому что ярлык отбрасывается. Хотя я не уверен, почему!