Easier way to plot the cumulative frequency distribution in ggplot?

匿名 (未验证) 提交于 2019-12-03 01:23:02

问题:

I'm looking for an easier way to draw the cumulative distribution line in ggplot.

I have some data whose histogram I can immediately display with

qplot (mydata, binwidth=1);

I found a way to do it at http://www.r-tutor.com/elementary-statistics/quantitative-data/cumulative-frequency-graph but it involves several steps and when exploring data it's time consuming.

Is there a way to do it in a more straightforward way in ggplot, similar to how trend lines and confidence intervals can be added by specifying options?

回答1:

There is a built in ecdf() function in R which should make things easier. Here's some sample code, utilizing plyr

library(plyr) data(iris)  ## Ecdf over all species iris.all <- summarize(iris, Sepal.Length = unique(Sepal.Length),                              ecdf = ecdf(Sepal.Length)(unique(Sepal.Length)))  ggplot(iris.all, aes(Sepal.Length, ecdf)) + geom_step()  #Ecdf within species iris.species <- ddply(iris, .(Species), summarize,                             Sepal.Length = unique(Sepal.Length),                             ecdf = ecdf(Sepal.Length)(unique(Sepal.Length)))  ggplot(iris.species, aes(Sepal.Length, ecdf, color = Species)) + geom_step()

Edit I just realized that you want cumulative frequency. You can get that by multiplying the ecdf value by the total number of observations:

iris.all <- summarize(iris, Sepal.Length = unique(Sepal.Length),                              ecdf = ecdf(Sepal.Length)(unique(Sepal.Length)) * length(Sepal.Length))  iris.species <- ddply(iris, .(Species), summarize,                             Sepal.Length = unique(Sepal.Length),                             ecdf = ecdf(Sepal.Length)(unique(Sepal.Length))*length(Sepal.Length))


回答2:

The new version of ggplot2 (0.9.2.1) has a built-in stat_ecdf() function which let's you plot cumulative distributions very easily.

qplot(rnorm(1000), stat = "ecdf", geom = "step")

Or

df <- data.frame(x = c(rnorm(100, 0, 3), rnorm(100, 0, 10)),              g = gl(2, 100)) ggplot(df, aes(x, colour = g)) + stat_ecdf()

Code samples from ggplot2 documentation.



回答3:

Even easier:

qplot(unique(mydata), ecdf(mydata)(unique(mydata))*length(mydata), geom='step')


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!