如何为分箱数据绘制累积分布函数(CDF)?

时间:2016-06-03 22:05:07

标签: r plot ecdf

我已经获得了我在范围内呈现的离散数据 例如

         Marks Freq cumFreq 
1  (37.9,43.1]    4       4    
2  (43.1,48.2]   16      20   
3  (48.2,53.3]   76      96    

我需要为这些数据绘制cmf,我知道有

plot(ecdf(x))

但我不知道要添加什么来获得我需要的东西。

2 个答案:

答案 0 :(得分:3)

以下是一些选项:

library(ggplot2)
library(scales)
library(dplyr)

## Fake data
set.seed(2)
dat = data.frame(score=c(rnorm(130,40,10), rnorm(130,80,5)))

如果您有原始数据,请点击此处如何绘制ECDF:

# Base graphics
plot(ecdf(dat$score))

# ggplot2
ggplot(dat, aes(score)) +
  stat_ecdf(aes(group=1), geom="step")

如果您只有摘要数据,这是绘制ECDF的一种方法:

首先,让我们将数据分组到分档中,类似于您在问题中的内容。我们使用cut函数创建二进制文件,然后创建一个新的pct列来计算总分数的每个二进制分数。我们使用dplyr链接运算符(%>%)在一个"链"中完成所有操作。功能。

dat.binned = dat %>% count(Marks=cut(score,seq(0,100,5))) %>%
         mutate(pct = n/sum(n))

现在我们可以绘制它。 cumsum(pct)计算累积百分比(例如问题中的cumFreq)。 geom_step使用这些累积百分比创建步骤图。

ggplot(dat.binned, aes(Marks, cumsum(pct))) +
  geom_step(aes(group=1)) +
  scale_y_continuous(labels=percent_format()) 

这是图表的样子:

enter image description here

enter image description here

enter image description here

答案 1 :(得分:0)

那呢:

library(ggplot2)
library(scales)
library(dplyr)

set.seed(2)
dat = data.frame(score = c(rnorm(130,40,10), rnorm(130,80,5)))
dat.binned = dat %>% count(Marks = cut(score,seq(0,100,5))) %>%
         mutate(pct = n/sum(n))
ggplot(data = dat.binned, mapping = aes(Marks, cumsum(pct))) +  
  geom_line(aes(group = 1)) + 
  geom_point(data = dat.binned, size = 0.1, color = "blue") +
  labs(x = "Frequency(Hz)", y = "Axis") +
  scale_y_continuous(labels = percent_format()) 

enter image description here