Как я могу преобразовать эстетику «на лету» в ggplot, используя переменные внутри или вне соответствующего фрейма данных?

В психологии принято отображать гистограммы с наложенной на них нормальной кривой. Кроме того, отображение плотности наблюдаемых значений с помощью geom_line облегчило бы сравнение с нормальной кривой, поэтому я написал еще одну функцию гистограммы, которая делает это (powerHist в пакете userfriendlyscience). Однако он работает очень медленно для больших векторов (в настоящее время работает с 16,7 миллионами точек данных), поэтому я пытаюсь сделать его быстрее. Раньше я использовал density для ручного вычисления оценок плотности, а затем умножал их на максимальное количество точек данных в ячейке, чтобы масштабировать их в соответствии с гистограммой.

Но это очень медленно, плюс я подумал, что ggplot2 должен это делать. Одной из переменных, вычисляемых stat_density, является ..scaled.., которая является оценкой плотности, масштабированной до максимального значения 1. Теперь мне просто нужно умножить это. Но ggplot2 не найдет переменную, которую я использую. Умножение его на константу работает нормально, но помещу ли я переменную в кадр данных, который передаю в ggplot2, или нет, похоже, не имеет значения: ggplot2 не может ее найти.

scalingFactor <- max(table(cut(mtcars$mpg, breaks=20)));
dat <- data.frame(mpg = mtcars$mpg,
                  scalingFactor = scalingFactor);
ggplot(mtcars, aes(x=mpg)) +
  geom_histogram(bins=20) +
  geom_line(aes(y=..scaled.. * scalingFactor),
            stat='density', color='red');

Это дает:

Error in eval(expr, envir, enclos) : object 'scalingFactor' not found

При замене scalingFactor на обычный номер работает:

ggplot(mtcars, aes(x=mpg)) +
  geom_histogram(bins=20) +
  geom_line(aes(y=..scaled.. * 10),
            stat='density', color='red');

Гистограмма с жестко заданной кривой плотности

Кроме того, при простом использовании scalingFactor он также работает:

ggplot(mtcars, aes(x=mpg)) +
  geom_histogram(bins=20) +
  geom_line(aes(y=scalingFactor ),
            stat='density', color='red');

Гистограмма с горизонтальной линией, показывающей коэффициент масштабирования

Итак, scalingFactor кажется доступным; доступно умножение; и явно ..scaled.. доступен. Тем не менее, объединить их, похоже, не удастся. Что мне здесь не хватает? Я не могу найти ничего о «вычислениях с переменными, сгенерированными статистикой» или что-то в этом роде. . .

Кто-нибудь сталкивался с этим раньше? Известно ли поведение ggplot2, которое я только что пропустил?


person Matherion    schedule 17.09.2016    source источник


Ответы (1)


попробуй с aes_q(y=bquote(..scaled.. * .(scalingFactor)))

(хотя я бы подумал, что где-то есть ошибка, поскольку аргумент среды в ?ggplot предполагает, что это не нужно, и на самом деле не нужно при работе с переменными, которые не исходят из статистики)

person baptiste    schedule 17.09.2016
comment
Есть ли проблема для этого в github ggplot2? Самое близкое, что я смог найти, это github.com/tidyverse/ggplot2/issues/2321. и хотя это кажется связанным, я не уверен, что это точно одно и то же. - person jcb; 12.04.2018