2013-02-25 6 views
7

мне нужно построить несколько точек данных, которые определены какземля пределы 95% доверительный в диаграмме рассеяния

с (х, у, stdev_x, stdev_y)

как график рассеяния с представлением из их 95% доверительных пределов, для примеров, показывающих точку и один контур вокруг нее. В идеале я хотел бы охарактеризовать овал вокруг точки, но не знаю, как это сделать. Я думал о создании образцов и их построении, добавив stat_density2d(), но мне нужно было бы ограничить количество контуров до 1 и не мог понять, как это сделать.

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

ответ

3

Просто найти функцию stat_ellipse()herehere) и заботится об этом красиво.

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

Различные набор данных, конечно:

2

Я ничего не знаю о библиотеке ggplot2, но вы можете нарисовать эллипсы с помощью графика. Этот сюжет выглядит примерно так, как вы просите?

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

Ого, это элегантное решение, спасибо любезно! Все-таки надеюсь, что смогу сделать это в ggplot2. – koenbro

6

Во-первых, вы сохранили весь свой участок как объект (измененные лимиты).

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

С функцией ggplot_build() сохранить всю информацию, используемую для сюжета. Контуры хранятся в объекте 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 

Есть в общей сложности 12 контурных линий, но сохранить только внешнюю линию, вы должны Подмножество только group=="1-1" и заменить исходную информацию.

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

Затем используйте ggplot_gtable() и grid.draw(), чтобы получить участок.

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

enter image description here

+1

Благодарим вас за ответ. Как мы узнаем, что внешний контур составляет 95%, а не 97 или 99%, например? Это может быть очевидно, но я не нашел его в документации (в том числе и для kde2d). – koenbro

+0

Теперь это решение показывает только, как сохранить только одну контурную линию. Об этой уверенности нужно смотреть дальше. –

4

latticeExtra обеспечивает panel.ellipse является функцией панели решетки, которая вычисляет и рисует доверительный эллипсоид из двумерных данных, возможно, сгруппированных по третьей переменной.

здесь я рисую уровни 0,65 и 0,95, подавая иск на ваши данные.

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

Похоже функции stat_ellipse, что вы нашли действительно отличное решение, но вот еще один (не ggplot), только для записи, используя dataEllipse из пакета 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

Смежные вопросы