【问题标题】:Contour plot: density of sites with latitude and longitude locations等高线图:具有纬度和经度位置的站点密度
【发布时间】:2016-10-20 08:48:31
【问题描述】:

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

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)

【问题讨论】:

  • 喜欢x &lt;- z[seq(1,length(z), 2)];y &lt;- z[seq(2,length(z), 2)];contour(MASS::kde2d(x, y))?
  • 我试过了,得到了这个错误。轮廓错误(MASS::kde2d(x,y)):在为函数“轮廓”选择方法时评估参数“x”时出错:is.finite(x)错误:未为“列表”类型实现默认方法'。 @lukeA
  • 为我工作。也许您错误地发布了数据。 dim(z)NULL,而不是 c(15,2)

标签: r plot contour kernel-density


【解决方案1】:

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 的网格。密度估计是在这个网格上完成的。也许您想知道为什么要在常规网格上进行估算。因为这样的网格就像数码照片的像素。类似网格/栅格的对象便于可视化。实际上,如果你想让计算机处理 3D 图形,你必须给它一个类似对象的栅格。

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

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

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

【讨论】:

  • 如果我的数据的经纬度值比例不均匀,甚至没有像本例那样的比例尺,这会起作用吗?
  • 我在一个国家/地区随机有大约 1000 个纬度/经度点,并希望根据这些“密度”或位置来制作我的轮廓
  • 当我尝试你所拥有的东西时,它似乎只给了我一个带有 z 值的 25x25 矩阵,而不是我的所有观点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
相关资源
最近更新 更多