2013-02-25 10 views
7

muss ich mehrere Datenpunkte zeichnen, die alsPlot 95% Konfidenzgrenzen in Scatterplot

definiert sind

c (x, y, stdev_x, stdev_y)

als Streudiagramm mit einer Darstellung ihrer 95% Vertrauensgrenzen, für Beispiele, die den Punkt und eine Kontur um ihn herum zeigen. Idealerweise würde ich gerne auf Oval um den Punkt herum zeichnen, aber ich weiß nicht, wie ich es machen soll. Ich dachte daran, Beispiele zu erstellen und sie zu plotten, indem ich stat_density2d() hinzufügte, aber die Anzahl der Konturen auf 1 begrenzen musste und nicht herausfinden konnte, wie das geht.

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

Antwort

3

gefunden einfach die Funktion stat_ellipse()here (und here) und es kümmert sich um dieses wunderschön.

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

Verschiedene Datensatz, natürlich:

2

Ich weiß nichts über die Bibliothek ggplot2, aber Sie können Ellipsen mit Plotrix zeichnen. Sieht diese Handlung so aus, wie Sie es wünschen?

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, das ist eine elegante Lösung, wir danken Ihnen herzlich! Hoffe ich könnte das aber in ggplot2 machen. – koenbro

6

Zuerst alle Ihre Plot als Objekt (geänderte Grenzen) gespeichert.

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

Mit Funktion ggplot_build() speichern alle Informationen für den Plot verwendet. Konturen werden im Objekt data[[2]] gespeichert.

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 

Es insgesamt 12 Konturlinien ist aber nur äußeree Linie zu halten, sollten Sie nur group=="1-1" und ersetzen ursprüngliche Informationsteilmenge.

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

verwenden Dann ggplot_gtable() und grid.draw() Ihr Grundstück zu bekommen.

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

enter image description here

+1

Vielen Dank für die Antwort. Woher wissen wir, dass die Außenkontur bei 95% liegt und nicht beispielsweise bei 97 oder 99%? Das mag offensichtlich sein, aber ich habe es in der Dokumentation (einschließlich der für kde2d) nicht gefunden. – koenbro

+0

Jetzt zeigt diese Lösung nur, wie nur eine Konturlinie beibehalten wird. Über dieses Vertrauen muss man weiter schauen. –

4

latticeExtra bietet panel.ellipse ist eine Gitterplatte Funktion, die berechnet und zeichnet ein Vertrauen von bivariate Daten Ellipsoid, möglicherweise durch eine dritte Variable zusammengefasst.

Hier zeichne ich die Ebenen 0.65 und 0.95 und verklagt Ihre Daten.

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

Sieht aus wie die stat_ellipse Funktion, die Sie ist wirklich eine großartige Lösung gefunden, aber hier ist ein anderer (nicht-ggplot), nur für das Protokoll, mit dataEllipse aus dem car Paket.

# 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