Подтвердить что ты не робот

Вычисление суммарного счета в ggplot2

Есть несколько сообщений о построении кумулятивных плотностей в ggplot. В настоящее время я использую принятый ответ Более простой способ построения кумулятивного распределения частот в ggplot? для построения моих совокупных показателей. Но это решение предполагает предварительное вычисление значений заранее.

Здесь я ищу чистое решение ggplot. Покажите, что я до сих пор:

x <- data.frame(A=replicate(200,sample(c("a","b","c"),1)),X=rnorm(200))

ggplot stat_ecdf

Я могу использовать ggplot stat_ecdf, но он отображает только кумулятивные плотности:

ggplot(x,aes(x=X,color=A)) + geom_step(aes(y=..y..),stat="ecdf")

enter image description here

Я хотел бы сделать что-то вроде следующего, но это не работает:

ggplot(x,aes(x=X,color=A)) + geom_step(aes(y=..y.. * ..count..),stat="ecdf")

cumsum и stat_bin

Я нашел идею об использовании cumsum и stat_bin:

ggplot(x,aes(x=X,color=A)) + stat_bin(aes(y=cumsum(..count..)),geom="step")

enter image description here

Но, как вы можете видеть, следующий цвет не начинается с y=0, но заканчивается последний цвет.

Что я прошу

Что я хотел бы иметь от лучшего до худшего:

  • В идеале простое исправление для неработающего

    ggplot(x,aes(x=X,color=A)) + geom_step(aes(y=..y.. * ..count..),stat="ecdf")
    
  • Более сложный способ использования stat_ecdf со счетами.

  • Последним вариантом было бы использовать подход cumsum, так как он дает худшие (закодированные) результаты.
4b9b3361

Ответ 1

Это не решит прямую проблему с группировкой строк, но будет обходным путем.

Вы можете добавить три вызова к stat_bin(), где вы подмножите свои данные в соответствии с уровнями A.

ggplot(x,aes(x=X,color=A)) +
  stat_bin(data=subset(x,A=="a"),aes(y=cumsum(..count..)),geom="step")+
  stat_bin(data=subset(x,A=="b"),aes(y=cumsum(..count..)),geom="step")+
  stat_bin(data=subset(x,A=="c"),aes(y=cumsum(..count..)),geom="step")

enter image description here

UPDATE - решение с использованием geom_step()

Другая возможность - умножить значения ..y.. на число наблюдений на каждом уровне. Чтобы получить это количество наблюдений в этот момент, я нашел только предварительный расчет их перед построением графика и добавление их в исходный кадр данных. Я назвал этот столбец len. Затем в geom_step() внутри aes() вы должны определить, что вы будете использовать переменную len=len, а затем определите значения y как y=..y.. * len.

set.seed(123)
x <- data.frame(A=replicate(200,sample(c("a","b","c"),1)),X=rnorm(200))
library(plyr)
df <- ddply(x,.(A),transform,len=length(X))
ggplot(df,aes(x=X,color=A)) + geom_step(aes(len=len,y=..y.. * len),stat="ecdf") 

enter image description here