2011-08-08 34 views
13

Tôi có một khung dữ liệu, mà sau khi áp dụng các chức năng tan trông tương tự như:ECDF trên cốt truyện tương tự sử dụng ggplot2

var  val 
1 a 0.6133426 
2 a 0.9736237 
3 b 0.6201497 
4 b 0.3482745 
5 c 0.3693730 
6 c 0.3564962 

.................

Khung dữ liệu ban đầu có 3 cột có tên cột, a, b, c và các giá trị được liên kết của chúng. Tôi cần vẽ trên cùng một biểu đồ, sử dụng ggplot ecdf liên quan cho mỗi cột này (ecdf (a), ecdf (b), ecdf (c)) nhưng tôi không thực hiện được điều này. Tôi cố gắng:

p<-ggplot(melt_exp,aes(melt_exp$val,ecdf,colour=melt_exp$var)) 
pg<-p+geom_step() 

Nhưng tôi nhận được một lỗi: lý lẽ ngụ ý số hàng khác nhau: 34.415, 0.

Có ai có một ý tưởng về cách thức này có thể được thực hiện? Biểu đồ sẽ trông giống như đồ thị được trả về bởi lô (ecdf (x)), không phải là một biểu đồ giống như đồ thị.

Cảm ơn bạn!

+3

Lưu ý rằng bạn không bao giờ nên có một '$' bên trong 'aes'. – hadley

+1

Xem http://stackoverflow.com/a/12762919/350713 Đây có lẽ là cách tốt nhất để vẽ CDF bằng ggplot2. –

Trả lời

16

Suy nghĩ đầu tiên của tôi là cố gắng sử dụng stat_function, nhưng kể từ khi ecdf trả về một chức năng, tôi không thể nhận được rằng làm việc một cách nhanh chóng. Thay vào đó, đây là một giải pháp cần thiết bạn đính kèm các giá trị tính toán vào khung dữ liệu đầu tiên (sử dụng dữ liệu ví dụ Ramnath của):

library(plyr) # function ddply() 
mydf_m <- ddply(mydf_m, .(variable), transform, ecd = ecdf(value)(value)) 

ggplot(mydf_m,aes(x = value, y = ecd)) + 
    geom_line(aes(group = variable, colour = variable)) 

enter image description here

Nếu bạn muốn có một ước tính trơn tru của ECDF bạn cũng có thể sử dụng geom_smooth cùng với các chức năng ns() từ gói spline:

library(splines) # function ns() 
ggplot(mydf_m, aes(x = value, y = ecd, group = variable, colour = variable)) + 
    geom_smooth(se = FALSE, formula = y ~ ns(x, 3), method = "lm") 

enter image description here

Như đã lưu ý trong một nhận xét ở trên, kể từ phiên bản 0.9.2.1, ggplot2 có một chỉ số cụ thể cho mục đích này: stat_ecdf. Sử dụng điều đó, chúng tôi chỉ làm một cái gì đó như thế này:

ggplot(mydf_m,aes(x = value)) + stat_ecdf(aes(colour = variable)) 
+0

@ Joran-tôi đã có một đồ thị đẹp. Cảm ơn. Đó là khá tốt mà không cần làm mịn, nhưng bây giờ nó hoàn hảo :) – agatha

+0

oops không thấy câu trả lời của bạn joran – Ramnath

+0

+1 cho stat_ecdf! Thật tốt khi biết điều đó. Cần có thư viện – Eduardo

2

Dưới đây là một cách tiếp cận

require(ggplot2) 
mydf = data.frame(
    a = rnorm(100, 0, 1), 
    b = rnorm(100, 2, 1), 
    c = rnorm(100, -2, 0.5) 
) 

mydf_m = melt(mydf) 

p0 = ggplot(mydf_m, aes(x = value)) + 
    geom_density(aes(group = variable, colour = variable)) + 
    opts(legend.position = c(0.85, 0.85)) 
+0

Điều này rất hữu ích cho việc vẽ biểu đồ hàm mật độ trên cùng một ô, tuy nhiên tôi đang tìm kiếm một cái gì đó tương tự như: http: //mikelove.wordpress.com/category/visualization/page/2/, đường cong màu đen, chứ không phải màu đỏ một. Tôi muốn fucntions cdf âm mưu như bạn đã làm với các chức năng mật độ, và tôi đã không quản lý để làm điều đó – agatha

5

Dựa trên Ramnath, cách tiếp cận trên, bạn sẽ có được ecdf từ ggplot2 bằng cách làm như sau:

require(ggplot2) 
mydf = data.frame(
    a = rnorm(100, 0, 1), 
    b = rnorm(100, 2, 1), 
    c = rnorm(100, -2, 0.5) 
) 

mydf_m = melt(mydf) 

p0 = ggplot(mydf_m, aes(x = value)) + 
    stat_ecdf(aes(group = variable, colour = variable)) 
print(p0) 
+0

(phải định hình lại). – EngrStudent

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