用ggplot2绘制多元高斯等高线

Jam*_*ers 5 r ggplot2

我试图用具有已知均值和协方差的2D高斯分布来增加具有轮廓的图.理想情况下,我只需要指定函数,它将在2D中绘制(如stat_function2维除外).我可以geom_raster通过生成概率网格来实现.我能geom_contour2d以某种方式使用吗?

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Jam*_*ers 6

我正在咆哮错误的树看2d东西。你可以geom_contour通过添加z美感来实现我想要的:

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) 
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Ben*_*ker 4

我将使用该ellipse包直接构建轮廓数据。这仍然需要单独的调用来构建数据,但比构建整个网格然后查找轮廓的解决方案要高效得多(在空间和时间上)。

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)
Run Code Online (Sandbox Code Playgroud)

(你可以使用lapplyandrbind来自基本 R;plyr::ldply只是一个快捷方式)

现在绘制:

library(ggplot2)
ggplot(contour_data,aes(x,y,group=.id))+geom_path()
Run Code Online (Sandbox Code Playgroud)