2010-08-23 36 views
27

Tôi đang tìm cách dễ dàng hơn để vẽ đường phân phối tích lũy trong ggplot.Cách dễ dàng hơn để vẽ phân bố tần số tích lũy trong ggplot?

Tôi có một số dữ liệu có histogram tôi ngay lập tức có thể hiển thị với

qplot (mydata, binwidth=1); 

Tôi tìm thấy một cách để làm điều đó tại http://www.r-tutor.com/elementary-statistics/quantitative-data/cumulative-frequency-graph nhưng nó liên quan đến một số bước và khi khám phá dữ liệu mà nó là tốn thời gian.

Có cách nào để làm điều đó một cách đơn giản hơn trong ggplot, tương tự như cách các đường xu hướng và khoảng tin cậy có thể được thêm bằng cách chỉ định các tùy chọn?

Trả lời

23

Có tích hợp chức năng ecdf() trong R, điều này sẽ giúp mọi thứ trở nên dễ dàng hơn. Dưới đây là một số mẫu mã, sử dụng 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() 

Sửa Tôi chỉ nhận ra rằng bạn muốn tần số tích lũy. Bạn có thể nhận được rằng bằng cách nhân giá trị ecdf cho tổng số quan sát:

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)) 
+0

Đây là một câu trả lời tuyệt vời, nhưng có một điều tôi không thể hiểu được. Trong 'ecdf (Sepal.Length) (duy nhất (Sepal.Length))' bit, những gì đang xảy ra? Tôi hiểu rằng nó trích xuất các giá trị cụ thể từ đối tượng 'ecdf', nhưng tôi không nhớ đã từng thấy ký hiệu (x) (y) trước đây ... bạn có thể giúp tôi hiểu điều đó không? Cảm ơn! –

+3

@MattParker 'ecdf()' trả về một hàm để ký pháp đang đánh giá hàm trả về ở các giá trị duy nhất của 'Sepal.Length'. –

+0

@GavinSimpson OK, cảm ơn! –

20

Thậm chí dễ dàng hơn:

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

Thật tuyệt, nhưng ngắn gọn đến mức tôi đang gặp khó khăn khi dịch sang lệnh ggplot mà tôi có thể sử dụng để đặt nhãn tiêu đề và trục. – dfrankow

+0

Tôi cho rằng tôi có thể sử dụng chính, xlab, ylab. – dfrankow

+0

Ước gì tôi có thể upvote hai lần, tôi đã trở lại đây nhiều lần. – dfrankow

46

Phiên bản mới của ggplot2 (0.9.2.1) có một built-in stat_ecdf() chức năng cho phép bạn vẽ các bản phân phối tích lũy rất dễ dàng.

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

Hoặc

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() 

mẫu mã từ tài liệu ggplot2.

Các vấn đề liên quan