等高线图:具有纬度和经度位置的站点密度

Contour plot: density of sites with latitude and longitude locations

我有这种格式的数据,想做等高线图。当我尝试使用 density(z) 时,我收到错误消息 "x must be numeric"。我不确定如何转换我的数据以使其成为生成轮廓的正确格式。我只是希望它基于点的密度,因为两列代表我的 long/lat.

z <- c(
  c(8.83,8.89),
  c(8.89,8.94),
  c(8.84,8.9),
  c(8.79,8.852),
  c(8.79,8.88),
  c(8.8,8.82),
  c(8.75,8.78),
  c(8.8,8.8),
  c(8.74,8.81),
  c(8.89,8.99),
  c(8.97,8.97),
  c(9.04,9.08),
  c(9,9.01),
  c(8.99,8.99),
  c(8.93,8.97)
)
z <- matrix(z, ncol = 2, byrow = TRUE)

density()用于单变量密度估计。由于您有两个自变量:longlat,您应该使用 R 的默认包 MASS.

中的 kde2d()
library(MASS)
fit <- kde2d(z[,1], z[,2])
contour(fit$x, fit$y, fit$z)
## show original data locations
points(z, pch = 19, col = 4)


跟进

如果你看?kde2d

Usage:

     kde2d(x, y, h, n = 25, lims = c(range(x), range(y)))

沿 xy 的默认单元格数为 n = 25,这将为您提供 25 * 25 的网格。密度估计是在这个网格上完成的。也许您想知道为什么要在规则网格上进行估计。因为这样的网格就像数码照片的像素。 Grid/raster like对象方便可视化。实际上,如果你想让计算机进行3D图形,你必须给它一个类似对象的光栅。

在实践中,你应该根据你有多少数据来选择n。请注意,一个 25 * 25 的网格有 625 个单元格,当您有 1000 个数据点时,这是相当公平的。您也可以尝试 n = 50。设置 n 与生成直方图时设置 bin 数非常相似。随着 n 的增加,您得到的估计更加参差不齐。不清楚的可以考虑直方图的例子:

x <- rnorm(200)
hist(x, breaks = 10)
hist(x, breaks = 20)

准确的说,密度估计不同于直方图;前者是内核平滑器,而后者是原始 bin 平滑器。但是选择n(细化)确实有同样的效果。