ggplot2 - 修改 geom_density2d 以接受权重作为参数?

Posted

技术标签:

【中文标题】ggplot2 - 修改 geom_density2d 以接受权重作为参数?【英文标题】:ggplot2 - Modify geom_density2d to accept weights as a parameter? 【发布时间】:2014-08-03 14:40:29 【问题描述】:

这是我在 R 社区的第一篇文章,如果它很愚蠢,请原谅我。我想在 ggplot2 中使用函数 geom_density2d 和 stat_density2d 来绘制内核密度估计,但问题是它们无法处理加权数据。据我了解,这两个函数调用包 MASS 中的函数 kde2d 来进行内核密度估计。而且kde2d不以数据权重为参数。

现在,我找到了 kde2d http://www.inside-r.org/node/226757 的这个修改版本,它以权重为参数,基于 kde2d 的源代码。该函数的代码:

  kde2d.weighted <- function (x, y, w, h, n = 25, lims = c(range(x), range(y))) 
  nx <- length(x)
  if (length(y) != nx) 
    stop("data vectors must be the same length")
  if (length(w) != nx & length(w) != 1)
    stop("weight vectors must be 1 or length of data")
  gx <- seq(lims[1], lims[2], length = n) # gridpoints x
  gy <- seq(lims[3], lims[4], length = n) # gridpoints y
  if (missing(h)) 
    h <- c(bandwidth.nrd(x), bandwidth.nrd(y));
  if (missing(w)) 
    w <- numeric(nx)+1;
  h <- h/4
  ax <- outer(gx, x, "-")/h[1] # distance of each point to each grid point in x-direction
  ay <- outer(gy, y, "-")/h[2] # distance of each point to each grid point in y-direction
  z <- (matrix(rep(w,n), nrow=n, ncol=nx, byrow=TRUE)*matrix(dnorm(ax), n, nx)) %*% t(matrix(dnorm(ay), n, nx))/(sum(w) * h[1] * h[2]) # z is the density
  return(list(x = gx, y = gy, z = z))

我想让函数 geom_density2d 和 stat_density2d 调用 kd2d.weighted 而不是 kde2d,从而使它们接受加权数据。

我从未更改过现有 R 包中的任何函数,所以我的问题是最简单的方法是什么?

【问题讨论】:

【参考方案1】:

您实际上可以将自己的密度数据传递给geom_contour,这可能是最简单的。让我们从一个示例数据集开始,为间歇泉数据添加权重。

library("MASS")
data(geyser, "MASS")
geyserw <- transform(geyser,
   weight = sample(1:5, nrow(geyser), replace=T)
)

现在我们使用您的加权函数来计算密度并将其转换为 data.frame

dens <- kde2d.weighted(geyserw$duration, geyserw$waiting, geyserw$weight)
dfdens <- data.frame(expand.grid(x=dens$x, y=dens$y), z=as.vector(dens$z))

现在我们绘制数据

ggplot(geyserw, aes(x = duration, y = waiting)) +
    geom_point() + xlim(0.5, 6) + ylim(40, 110) +
    geom_contour(aes(x=x, y=y, z=z), data= dfdens)

应该这样做

【讨论】:

谢谢!正是我想要的。不过,是否可以使用此 geom_contour 进行填充等高线图? 将“重量”重命名为“重量”到 geyserw data.frame 中,它可以完美运行。

以上是关于ggplot2 - 修改 geom_density2d 以接受权重作为参数?的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用ggplot2包使用geom_density()函数绘制基础密度图实战(density plot)

R语言使用ggplot2包使用geom_density()函数绘制密度图(填充色线性设置)实战(density plot)

R语言使用ggplot2包使用geom_density()函数绘制分组密度图(线条色彩添加均值线)实战(density plot)

R语言使用ggplot2包使用geom_density()函数绘制分组密度图(分组拆分画板基于facet)实战(density plot)

R语言使用ggplot2包使用geom_density()函数绘制密度图(连续色彩离散色彩梯度色彩)实战(density plot)

R语言使用ggplot2包使用geom_density()函数绘制分组密度图(改变图例位置移除图例)实战(density plot)