The ggplot
像往常一样,优雅、快速、漂亮。但如果你想使用基础图形(image
, contour
, persp
)并显示您的实际频率(而不是平滑 2D 内核),您必须首先自己获取分箱并创建频率矩阵。下面是一些代码(不一定很优雅,但相当健壮),它们执行 2D 分箱并生成与上面的有些类似的绘图:
require(mvtnorm)
xy <- rmvnorm(1000,c(5,10),sigma=rbind(c(3,-2),c(-2,3)))
nbins <- 20
x.bin <- seq(floor(min(xy[,1])), ceiling(max(xy[,1])), length=nbins)
y.bin <- seq(floor(min(xy[,2])), ceiling(max(xy[,2])), length=nbins)
freq <- as.data.frame(table(findInterval(xy[,1], x.bin),findInterval(xy[,2], y.bin)))
freq[,1] <- as.numeric(freq[,1])
freq[,2] <- as.numeric(freq[,2])
freq2D <- diag(nbins)*0
freq2D[cbind(freq[,1], freq[,2])] <- freq[,3]
par(mfrow=c(1,2))
image(x.bin, y.bin, freq2D, col=topo.colors(max(freq2D)))
contour(x.bin, y.bin, freq2D, add=TRUE, col=rgb(1,1,1,.7))
palette(rainbow(max(freq2D)))
cols <- (freq2D[-1,-1] + freq2D[-1,-(nbins-1)] + freq2D[-(nbins-1),-(nbins-1)] + freq2D[-(nbins-1),-1])/4
persp(freq2D, col=cols)
为了获得真正有趣的时光,请尝试制作交互式、可缩放的 3D 表面:
require(rgl)
surface3d(x.bin,y.bin,freq2D/10, col="red")