2016-05-15 30 views
14

Tôi đang cố vẽ đồ thị CDF phân phối bằng cách sử dụng R và ggplot2. Tuy nhiên, tôi thấy khó khăn trong việc vẽ sơ đồ hàm CDF sau khi tôi chuyển trục Y để có được một đường thẳng. Loại âm mưu này thường được sử dụng trong các ô giấy Gumbel, nhưng ở đây tôi sẽ sử dụng làm ví dụ phân phối chuẩn.chuyển đổi tỷ lệ ggplot hoạt động khác nhau về các điểm và chức năng

Tôi tạo dữ liệu và vẽ sơ đồ hàm mật độ tích lũy của dữ liệu cùng với hàm. Chúng vừa khít. Tuy nhiên, khi tôi áp dụng phép biến đổi trục Y, chúng không còn phù hợp nữa.

sim <- rnorm(100) #Simulate some data 
sim <- sort(sim) #Sort it 

cdf <- seq(0,1,length.out=length(sim)) #Compute data CDF 

df <- data.frame(x=sim, y=cdf) #Build data.frame 

library(scales) 
library(ggplot2) 

#Now plot! 
gg <- ggplot(df, aes(x=x, y=y)) + 
     geom_point() + 
     stat_function(fun = pnorm, colour="red") 
gg 

Và sản lượng nên được một cái gì đó trên dòng: enter image description here Tốt!

Bây giờ tôi cố gắng chuyển đổi trục Y theo phân phối được sử dụng.

#Apply transformation 
gg + scale_y_continuous(trans=probability_trans("norm")) 

Và kết quả là: enter image description here

Những điểm được chuyển một cách chính xác (họ nằm trên một đường thẳng), nhưng chức năng không phải là!

Tuy nhiên, mọi thứ dường như làm việc tốt nếu tôi làm như thế này, việc tính toán CDF với ggplot:

ggplot(data.frame(x=sim), aes(x=x)) + 
    stat_ecdf(geom = "point") + 
    stat_function(fun="pnorm", colour="red") + 
    scale_y_continuous(trans=probability_trans("norm")) 

Kết quả là OK: This wokrs OK

Tại sao điều này xảy ra? Tại sao không tính toán CDF bằng tay với các phép biến đổi tỷ lệ?

Trả lời

8

này hoạt động:

gg <- ggplot(df, aes(x=x, y=y)) + 
    geom_point() + 
    stat_function(fun ="pnorm", colour="red", inherit.aes = FALSE) + 
    scale_y_continuous(trans=probability_trans("norm")) 
gg 

enter image description here

có thể giải thích:

Hoa Tài liệu: inherit.aes Nếu FALSE, đè thẩm mỹ mặc định, chứ không phải là kết hợp với họ . Điều này hữu ích nhất đối với các hàm trợ giúp xác định cả dữ liệu và tính thẩm mỹ và không nên kế thừa hành vi từ đặc tả cốt truyện mặc định, ví dụ: đường viền.

tôi đoán: Như scale_y_continuous thay đổi tính thẩm mỹ của cốt truyện chính, chúng tôi cần phải tắt mặc định inherit.aes=TRUE. Có vẻ như inherit.aes=TRUE trong stat_function chọn tính thẩm mỹ của nó từ lớp đầu tiên của cốt truyện và do đó việc chuyển đổi tỷ lệ không tác động trừ khi được chọn cụ thể.

+0

Cảm ơn bạn. Bạn có một giả thuyết về lý do tại sao sử dụng 'geom_ecdf()' hoạt động ngay cả khi không có 'inherit.aes'? – AF7

+1

'stat_ecdf' không có cấu trúc thừa kế thẩm mỹ, tùy chọn duy nhất là ghi đè thẩm mỹ lớp bằng cách ghi đè lớp đó. 'stat_function' mặt khác _superimposes_ một hàm trên lớp cốt truyện và' inherit.aes = TRUE' (mặc định) chọn ánh xạ thẩm mỹ từ lớp trên cùng của ô. Điều gì đã cho đi vấn đề thực tế đối với tôi là _superimpose_ trong 'stat_function'.Dường như với tôi rằng 'stat_function' được thiết kế để theo dõi ánh xạ của âm mưu thực tế mà bạn xây dựng (lớp trên cùng) mà không bị ảnh hưởng từ tất cả các thay đổi lớp dưới đối với ánh xạ thẩm mỹ. – Divi

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