2016-03-25 71 views
3

私は、既知の平均と共分散を持つ2次元ガウス分布から等高線をプロットすることを試みています。理想的には、関数を指定するだけで、2Dでプロットされます(2次元を除いてstat_functionなど)。私はgeom_rasterでそれを行うことができます。代わりにgeom_contour2dを使用できますか?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

答えて

1

。これには依然としてデータを構築するための別個の呼び出しが必要ですが、グリッド全体を構築して輪郭を見つけるというソリューションよりもはるかに効率的です(時間と空間の両方で)。

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

プロット;

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) 

plyr::ldplyは単なるショートカットですあなたは基本Rからlapplyrbindを使用することができます)

0

私は2dものを見て間違ってツリーを吠えました。あなたは、私がgeom_contourとし、z美学を追加することによって、欲しいものを達成することができます:私は直接、輪郭データを構築するためにellipseパッケージを使用することになり

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

関連する問題