2016-03-25 11 views
3

Ich versuche, ein Diagramm mit Konturen aus einer 2D-Gaußverteilung mit bekannten Mittelwert und Kovarianz zu erweitern. Im Idealfall würde ich nur die Funktion angeben und es würde in 2D (wie stat_function außer 2 Dimensionen) geplottet werden. Ich kann es mit geom_raster tun, indem ich ein Gitter von Wahrscheinlichkeitsdaten erzeuge. Kann ich stattdessen geom_contour2d verwenden?Plot multivariate Gauß-Konturen mit ggplot2

m <- c(.5, -.5) 
sigma <- matrix(c(1,.5,.5,1), nrow=2) 
data.grid <- expand.grid(s.1 = seq(-3, 3, length.out=200), s.2 = seq(-3, 3, length.out=200)) 
q.samp <- cbind(data.grid, prob = mvtnorm::dmvnorm(data.grid, mean = m, sigma = sigma)) 
ggplot(q.samp, aes(x=s.1, y=s.2)) + 
    geom_raster(aes(fill = prob)) + 
    coord_fixed(xlim = c(-3, 3), ylim = c(-3, 3), ratio = 1) 

enter image description here

Antwort

1

ich das ellipse Paket verwenden würde direkt die Konturdaten zu konstruieren. Dies erfordert immer noch einen separaten Aufruf, um die Daten zu konstruieren, ist aber (sowohl in Raum als auch in Zeit) viel effizienter als Ihre Lösung, ein gesamtes Gitter zu konstruieren und dann die Konturen zu finden.

library(ellipse) 
library(plyr) ## not necessary, but convenient 
m <- c(.5, -.5) 
sigma <- matrix(c(1,.5,.5,1), nrow=2) 
alpha_levels <- seq(0.5,0.95,by=0.05) ## or whatever you want 
names(alpha_levels) <- alpha_levels ## to get id column in result 
contour_data <- ldply(alpha_levels,ellipse,x=sigma, 
     scale=c(1,1), ## needed for positional matching 
     centre=m) 

(Sie lapply und rbind von der Basis R verwenden könnte; plyr::ldply ist nur eine Abkürzung)

Jetzt Grundstück:

library(ggplot2) 
ggplot(contour_data,aes(x,y,group=.id))+geom_path() 
0

ich den falschen Baum an 2d Sachen suchen bellen. Sie können erreichen, was ich mit geom_contour wollen und durch eine z ästhetische Zugabe:

m <- c(.5, -.5) 
sigma <- matrix(c(1,.5,.5,1), nrow=2) 
data.grid <- expand.grid(s.1 = seq(-3, 3, length.out=200), s.2 = seq(-3, 3, length.out=200)) 
q.samp <- cbind(data.grid, prob = mvtnorm::dmvnorm(data.grid, mean = m, sigma = sigma)) 
ggplot(q.samp, aes(x=s.1, y=s.2, z=prob)) + 
    geom_contour() + 
    coord_fixed(xlim = c(-3, 3), ylim = c(-3, 3), ratio = 1) 

enter image description here

Verwandte Themen