Вычисление суммарного счета в 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
, так как он дает худшие (закодированные) результаты.
Ответы
Ответ 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]()