Ошибка с переменной ggplot2 сопоставления с y и использованием stat = "bin"

Я использую ggplot2 для создания гистограммы:

geom_histogram(aes(x=...), y="..ncount../sum(..ncount..)")

и я получаю ошибку:

Mapping a variable to y and also using stat="bin".
  With stat="bin", it will attempt to set the y value to the count of cases in each group.
  This can result in unexpected behavior and will not be allowed in a future version of ggplot2.
  If you want y to represent counts of cases, use stat="bin" and don't map a variable to y.
  If you want y to represent values in the data, use stat="identity".
  See ?geom_bar for examples. (Deprecated; last used in version 0.9.2)

Что вызывает это вообще? Я смущен ошибкой, потому что я не сопоставляю переменную с y, просто гистограммой x и хотел бы, чтобы высота гистограммы отображала нормализованную часть данных (так что все высоты бара вместе составляют 100% данных.)

edit: если я хочу сделать график плотности geom_density вместо geom_histogram, использовать ..ncount../sum(..ncount..) или ..scaled..? Я не понимаю, что делает ..scaled...

Ответы

Ответ 1

Путаница здесь давно (как видно из подробного предупреждающего сообщения), что все начинается с stat_bin.

Но пользователи обычно не понимают, что их путаница вращается вокруг stat_bin, так как они обычно сталкиваются с проблемами при использовании geom_bar или geom_histogram. Обратите внимание на документацию для каждого: они оба используют stat = "bin" (в текущих версиях ggplot2 этот стат по умолчанию разбит на stat_bin для непрерывных данных и stat_count для дискретных данных).

Но пусть резервное копирование. geom_* управлять фактическим рендерингом данных в какую-то геометрическую форму. stat_* просто преобразуйте свои данные. Различие немного запутанно на практике, потому что добавление слоя stat_bin будет по умолчанию вызывать geom_bar и поэтому может казаться неотличимым от geom_bar, когда вы учитесь.

В любом случае, рассмотрим гистограммы и гистограммы гистограммы "bar". Оба явно собираются вовлечь некоторое количество данных где-то вдоль линии. Но наши данные можно либо предварительно обобщить, либо нет. Например, нам может понадобиться штриховой график из:

x
a
a
a
b
b
b

или эквивалентно от

x  y
a  3
b  3

Первый еще не был заколот. Второй - предварительно закодированный. Поведение по умолчанию для geom_bar и geom_histogram означает, что вы не предварительно привязали свои данные. Поэтому они попытаются вызвать stat_bin (для гистограмм, теперь stat_count для гистограмм) на ваши значения x.

Как говорится в предупреждении, он попытается отобразить y для вас в результате подсчета. Если вы также попытаетесь сопоставить y себя с какой-то другой переменной, вы попадаете в область "Здесь есть жертвы драконов". Отображение y функций переменных, возвращаемых stat_bin (..count.. и т.д.), Должно быть в порядке и не должно вызывать это предупреждение (это не для меня, используя пример @mnel выше).

Вывод здесь заключается в том, что для geom_bar, если вы предварительно вычислили высоты баров, всегда помните, что используете stat = "identity" или лучше использовать новый geom_col, который использует stat = "identity" по по умолчанию. Для geom_histogram очень маловероятно, чтобы вы предварительно вычислили бункеры, поэтому в большинстве случаев вам просто нужно помнить, что не следует сопоставлять y с чем-либо, кроме того, что возвращалось из stat_bin.

geom_dotplot использует его собственный битнинг stat, stat_bindot, и это обсуждение здесь также относится, я считаю. Подобная ситуация, как правило, не была проблемой с 2d биннингами (geom_bin2d и geom_hex), поскольку в аналогичной переменной z не было такой гибкости, как в биндинговой переменной y 1-й случай. Если будущие обновления начнут позволять больше причудливых манипуляций с 2d биндинговыми случаями, это, я думаю, станет чем-то, что вам нужно следить за ним.

Ответ 2

В документации для geom_histogram указано, что это псевдоним для stat_bin и geom_bar

В документации для geom_density указано, что с использованием stat_density

Следуя ссылкам (или непосредственно находив страницы справки)

stat_bin

Документация для stat_bin описывает, как stat_bin возвращает data.frame со следующими (дополнительными) столбцами

count количество точек в бункере

плотность плотность точек в ящике, масштабированная для интеграции в 1

ncount, масштабировано до максимума 1

плотность

ndensity, масштабированная до максимума 1

stat_density

Документация для stat_density описывает, как stat_density возвращает data.frame со следующими (дополнительными) столбцами

плотность оценка плотности

подсчет плотность * количество точек - полезны для графиков с плотной плотностью

масштабированная оценка плотности, масштабированная до максимума 1


Чтобы создать график в том же масштабе, вам кажется, что вы хотите ..ndensity.. от stat_bin и ..scaled.. от stat_density или ..density.. от

ggplot(dd, aes(x=x)) + 
  geom_histogram(aes(y= ..density..)) +  
  geom_density(aes(y=..density..))


ggplot(dd, aes(x=x)) + 
  geom_histogram(aes(y= ..ndensity..)) + 
  geom_density(aes(y=..scaled..))