我正在尝试使用ggplot2包生成带有R的加权密度图,并将它们保存为.png文件.在我的代码中,我正在生成100-1000个具有不同地理坐标的图.
问题是,如果我的数据集甚至是1500点,那么ggsave函数变得非常慢.然后大约花费100秒来保存这些图中的一个.根据我的理解,计算效率低下的原因是我正在绘制的ggplot2对象是网格,ggsave必须在保存之前打印它们.
那么,我想问有没有办法让这些ggplot2对象的保存效率更高?我的意思是除了降低kde2d密度估计的分辨率之外的任何其他方式,这确实会使数据帧被绘制得更小.
我提供了一个最小的工作示例,我生成了一个.png文件.当您在ggsave函数周围使用system.time()时,您将看到执行它需要大约100秒.
library(MASS)
library(ggplot2)
library(grid)
x <- runif(1550, 0, 100)
y <- runif(1550, 0, 100)
wg <- runif(1550, 0, 1)
data <- data.frame(x, y, wg)
source("C:/Users/cpt2avo/Documents/R/kde2dweighted.r")
dens <- kde2d.weighted(data$x, data$y, data$wg)
dfdens <- data.frame(expand.grid(x=dens$x, y=dens$y), z=as.vector(dens$z))
p <- ggplot(data, aes(x = x, y = y)) + stat_contour(data = dfdens, geom = "polygon", bins = 20, alpha = 0.2, aes(x = x, y = y, z = z, fill = ..level..)) + scale_fill_continuous(low = "green", high = "red") + …Run Code Online (Sandbox Code Playgroud) 这是我对R社区的第一篇文章,所以请原谅我。我想在ggplot2中使用函数geom_density2d和stat_density2d绘制内核密度估计值,但问题是它们无法处理加权数据。据我了解,这两个函数从软件包MASS中调用函数kde2d进行内核密度估计。而且kde2d不会将数据权重作为参数。
现在,我在http://www.inside-r.org/node/226757上找到了kde2d的此更改版本,该版本将权重作为参数并基于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 <- …Run Code Online (Sandbox Code Playgroud)