2013-02-25 38 views
7

tôi cần phải vẽ một số điểm dữ liệu được định nghĩa làLô giới hạn 95% độ tin cậy trong phân tán

c (x, y, stdev_x, stdev_y)

như một biểu đồ phân tán với một đại diện của các giới hạn tin cậy 95% của chúng, ví dụ cho thấy các điểm và một đường viền xung quanh nó. Lý tưởng nhất là tôi muốn vẽ hình bầu dục xung quanh điểm, nhưng không biết làm thế nào để làm điều đó. Tôi đã nghĩ đến việc xây dựng các mẫu và vẽ đồ thị, thêm stat_density2d() nhưng sẽ cần phải giới hạn số lượng đường viền thành 1 và không thể tìm ra cách thực hiện.

require(ggplot2) 
n=10000 
d <- data.frame(id=rep("A", n), 
       se=rnorm(n, 0.18,0.02), 
       sp=rnorm(n, 0.79,0.06)) 
g <- ggplot (d, aes(se,sp)) + 
    scale_x_continuous(limits=c(0,1))+ 
    scale_y_continuous(limits=c(0,1)) + 
    theme(aspect.ratio=0.6) 
g + geom_point(alpha=I(1/50)) + 
    stat_density2d() 

Trả lời

3

Chỉ cần tìm thấy chức năng stat_ellipse()here (và here) và nó sẽ chăm sóc của này đẹp.

g + geom_point(alpha=I(1/10)) + 
    stat_ellipse(aes(group=id), color="black") 

bộ dữ liệu khác nhau, tất nhiên:

2

Tôi không biết gì về thư viện ggplot2, nhưng bạn có thể vẽ hình elip bằng âm mưu. Liệu âm mưu này trông giống như những gì bạn đang yêu cầu?

library(plotrix) 
n=10 
d <- data.frame(x=runif(n,0,2),y=runif(n,0,2),seX=runif(n,0,0.1),seY=runif(n,0,0.1)) 
plot(d$x,d$y,pch=16,ylim=c(0,2),xlim=c(0,2)) 
draw.ellipse(d$x,d$y,d$seX,d$seY) 
+0

Wow, đây là một giải pháp thanh lịch, cảm ơn bạn vui lòng! Tuy nhiên, hy vọng tôi có thể làm điều này trong ggplot2, mặc dù. – koenbro

6

Trước tiên, lưu tất cả cốt truyện của bạn làm đối tượng (giới hạn thay đổi).

g <- ggplot (d, aes(se,sp, group=id)) + 
    scale_x_continuous(limits=c(0,0.5))+ 
    scale_y_continuous(limits=c(0.5,1)) + 
    theme(aspect.ratio=0.6) + 
    geom_point(alpha=I(1/50)) + 
    stat_density2d() 

Với chức năng ggplot_build() lưu tất cả thông tin được sử dụng cho cốt truyện. Đường bao được lưu trữ trong đối tượng data[[2]].

gg<-ggplot_build(g) 
str(gg$data) 
head(gg$data[[2]]) 
    level   x   y piece group PANEL 
1 10 0.1363636 0.7390318  1 1-1  1 
2 10 0.1355521 0.7424242  1 1-1  1 
3 10 0.1347814 0.7474747  1 1-1  1 
4 10 0.1343692 0.7525253  1 1-1  1 
5 10 0.1340186 0.7575758  1 1-1  1 
6 10 0.1336037 0.7626263  1 1-1  1 

Có tổng cộng 12 đường đồng mức nhưng để chỉ giữ đường ngoài, bạn chỉ nên đặt group=="1-1" và thay thế thông tin gốc.

gg$data[[2]]<-subset(gg$data[[2]],group=="1-1") 

Sau đó, sử dụng ggplot_gtable()grid.draw() để lấy cốt truyện của bạn.

p1<-ggplot_gtable(gg) 
grid.draw(p1) 

enter image description here

+1

Cảm ơn bạn đã trả lời. Làm thế nào để chúng ta biết rằng các đường viền bên ngoài là 95% và không 97 hoặc 99% chẳng hạn? Điều này có thể là hiển nhiên, nhưng tôi không tìm thấy nó trong tài liệu (bao gồm cả cho kde2d). – koenbro

+0

Bây giờ giải pháp này chỉ cho thấy cách giữ chỉ một đường đồng mức. Về sự tự tin này phải nhìn xa hơn. –

4

latticeExtra cung cấp panel.ellipse là một chức năng bảng điều khiển mạng mà tính toán và vẽ một niềm tin elip từ dữ liệu hai biến, có thể nhóm lại theo một biến thứ ba.

tại đây tôi vẽ các mức 0,65 và 0,95 kiện dữ liệu của bạn.

library(latticeExtra) 
xyplot(sp~se,data=d,groups=id, 
     par.settings = list(plot.symbol = list(cex = 1.1, pch=16)), 
     panel = function(x,y,...){ 
     panel.xyplot(x, y,alpha=0.2) 
     panel.ellipse(x, y, lwd = 2, col="green", robust=FALSE, level=0.65,...) 
     panel.ellipse(x, y, lwd = 2, col="red", robust=TRUE, level=0.95,...) 

     }) 

enter image description here

4

Hình như stat_ellipse chức năng mà bạn tìm thấy thực sự là một giải pháp tuyệt vời, nhưng đây là một số khác (không ggplot), chỉ cần cho các hồ sơ, sử dụng dataEllipse từ gói car.

# some sample data 
n=10000 
g=4 
d <- data.frame(ID = unlist(lapply(letters[1:g], function(x) rep(x, n/g)))) 
d$x <- unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))) 
d$y <- unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))) 

# plot points with 95% normal-probability contour 
# default settings... 
library(car) 
with(d, dataEllipse(x, y, ID, level=0.95, fill=TRUE, fill.alpha=0.1)) 

enter image description here

# with a little more effort... 
# random colours with alpha-blending 
d$col <- unlist(lapply(1:g, function (x) rep(rgb(runif(1), runif(1), runif(1), runif(1)),n/g))) 
# plot points first 
with(d, plot(x,y, col=col, pch=".")) 
# then ellipses over the top 
with(d, dataEllipse(x, y, ID, level=0.95, fill=TRUE, fill.alpha=0.1, plot.points=FALSE, add=TRUE, col=unique(col), ellipse.label=FALSE, center.pch="+")) 

enter image description here

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