2014-12-26 17 views
6

Tôi muốn thêm đường mật độ (mật độ thông thường thực tế) vào biểu đồ.Thêm đường mật độ vào biểu đồ có dữ liệu đếm trong ggplot2

Giả sử tôi có dữ liệu sau. Tôi có thể vẽ biểu đồ bằng ggplot2:

set.seed(123)  
df <- data.frame(x = rbeta(10000, shape1 = 2, shape2 = 4)) 

ggplot(df, aes(x = x)) + geom_histogram(colour = "black", fill = "white", 
             binwidth = 0.01) 

enter image description here

tôi có thể thêm một dòng mật độ sử dụng:

ggplot(df, aes(x = x)) + 
    geom_histogram(aes(y = ..density..),colour = "black", fill = "white", 
       binwidth = 0.01) + 
    stat_function(fun = dnorm, args = list(mean = mean(df$x), sd = sd(df$x))) 

enter image description here

Nhưng đây không phải là những gì tôi thực sự muốn, tôi muốn đường mật độ này được trang bị cho dữ liệu đếm.

Tôi đã tìm thấy một bài đăng tương tự (HERE) cung cấp giải pháp cho vấn đề này. Nhưng nó không hoạt động trong trường hợp của tôi. Tôi cần một yếu tố mở rộng tùy ý để có được những gì tôi muốn. Và đây không phải là khái quát hóa ở tất cả:

ef <- 100 # Expansion factor 

ggplot(df, aes(x = x)) + 
    geom_histogram(colour = "black", fill = "white", binwidth = 0.01) + 
    stat_function(fun = function(x, mean, sd, n){ 
    n * dnorm(x = x, mean = mean, sd = sd)}, 
    args = list(mean = mean(df$x), sd = sd(df$x), n = ef)) 

enter image description here

Bất kỳ manh mối mà tôi có thể sử dụng để khái quát này

  • đầu tiên để phân phối chuẩn,
  • sau đó với bất kỳ kích thước thùng khác,
  • và cuối cùng là bất kỳ phân phối nào khác sẽ rất hữu ích.
+0

đã có nghĩa cho hai hình ảnh biểu đồ để có giống nhau không? Có vẻ như bạn đã tải lên cùng một cái hai lần – arvi1000

+0

Sử dụng 'fitdistr (...)' trong gói 'MASS' để phù hợp với các bản phân phối. – jlhoward

Trả lời

10

Lắp đặt chức năng phân phối không xảy ra bằng phép thuật. Bạn phải làm điều đó một cách rõ ràng. Một cách là sử dụng fitdistr(...) trong gói MASS.

library(MASS) # for fitsidtr(...) 
# excellent fit (of course...) 
ggplot(df, aes(x = x)) + 
    geom_histogram(aes(y=..density..),colour = "black", fill = "white", binwidth = 0.01)+ 
    stat_function(fun=dbeta,args=fitdistr(df$x,"beta",start=list(shape1=1,shape2=1))$estimate) 

# horrible fit - no surprise here 
ggplot(df, aes(x = x)) + 
    geom_histogram(aes(y=..density..),colour = "black", fill = "white", binwidth = 0.01)+ 
    stat_function(fun=dnorm,args=fitdistr(df$x,"normal")$estimate) 

# mediocre fit - also not surprising... 
ggplot(df, aes(x = x)) + 
    geom_histogram(aes(y=..density..),colour = "black", fill = "white", binwidth = 0.01)+ 
    stat_function(fun=dgamma,args=fitdistr(df$x,"gamma")$estimate) 

EDIT: Response to comment OP của.

Hệ số tỷ lệ là binwidth & # x2715; cỡ mẫu. bạn

ggplot(df, aes(x = x)) + 
    geom_histogram(colour = "black", fill = "white", binwidth = 0.01)+ 
    stat_function(fun=function(x,shape1,shape2)0.01*nrow(df)*dbeta(x,shape1,shape2), 
       args=fitdistr(df$x,"beta",start=list(shape1=1,shape2=1))$estimate) 

+1

Cảm ơn bạn đã tổng quát hóa các bản phân phối khác nhau. Mục đích cuối cùng của tôi là để phù hợp với những dòng này để đếm dữ liệu thay vì mật độ. Bạn có hiểu biết về cách làm điều đó không? (Tôi muốn có được âm mưu giống như âm mưu thứ ba của bài đăng gốc.) – HBat

+1

Xem các chỉnh sửa ở trên. – jlhoward

+0

Giá trị '0,01' trong công thức (' 0,01 nrow (df) * dbeta (x, shape1, shape2) ') không thể khái quát hóa được với các kích thước hoặc kích thước mẫu khác nhau.Giả sử tôi có kích thước mẫu là 2474 (thay vì 10000) và 0,03 (thay vì 0,01). Tôi tin rằng 0,01 nên là chức năng của chiều rộng bin và có thể là kích thước mẫu. – HBat

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