【问题标题】:Interpolation (akima) omits part of data when x/y contains duplicate elements当 x/y 包含重复元素时,插值 (akima) 会省略部分数据
【发布时间】:2019-03-21 10:24:31
【问题描述】:

我正在制作一个函数,它接收三个向量,使用 akima 对它们进行插值,并使用 plot_ly() 绘制它们。尽管通用代码有效,但我遇到了 interp() 输出的 z 矩阵缩放问题。

让我举个例子:

  • x 是一个包含一些重复值的非 NA 数字。
  • y 是一个包含一些重复值的非 NA 数字。
  • z 是一个非 NA 连续向量

一些汇总统计数据:

> unique(x)
[1] 60 48 36 32 18 24 30 15 12 28 21 19 54 20 16 27 10 39 14 17  9  6 50  8 13
> range(x)
[1]  6 60

> unique(y)
[1] 10.00 10.50 13.50 12.50 14.00 12.00 11.00  9.00 11.50  9.25 13.00 10.25 6.50 6.75 8.25 9.50
[17]  8.00 8.85  9.75  7.90  7.00  8.60  8.75  7.50  8.90  8.50  7.49  7.40  5.50  7.60  7.25  8.35
[33]  6.00  5.00  7.75  7.35  6.30  4.50  5.75  8.40  5.60  5.90  7.74  9.90  6.20  5.80
> range(y)
[1]  4.5 14.0


> head(z)
[1] 2.877272 3.267328 3.175478 3.843326 4.809792 2.827825
> range(z)
[1]  2.316529 28.147808

我实现了下面的基线函数:

labs = list(x = 'x', y = 'y', z = 'z')

mat = interp(x, y, z, duplicate = 'mean', extrap = T, xo = sort(unique(x)))

plot_ly(x = mat$x, y = mat$y, z = mat$z, type = 'surface') %>%
    layout(title = title,
           scene = list(xaxis = list(title = labs$x),
                        yaxis = list(title = labs$y),
                        zaxis = list(title = labs$z)))

当我运行它时,输出如下:

问题是这张图片没有涵盖一部分数据。例如,在 x > 50, y

length(x[x > 50])
[1] 304
> length(y[x > 50 & y < 11])
[1] 290
> length(z[x > 50 & y < 11])
[1] 290

我怀疑这与重复的 x 值有关。因此,我在 interp() 中配置了 xo 参数,这样:

mat = interp(x, y, z, duplicate = 'mean', xo = sort(unique(x)), decreasing = T)

在这种情况下,先前省略的区域将被部分绘制。如下所示:

尽管如此,x 轴和 y 轴仍不对应于它们各自的数据范围(尽管数据可用)。底线:如何调整函数以使曲面始终扩展 x 和 y 的整个范围?

最好的

【问题讨论】:

    标签: r 3d plotly interpolation


    【解决方案1】:

    原来错误是由 plot_ly() 引起的。显然,z 矩阵不能直接从 interp() 传递到 plot_ly(),因为轴会错误地传递到图形。因此,需要对插值后的 z 矩阵进行变换。

    如果结合使用这两个函数,请确保如下图进行z的变换:

    mat = interp(x,y,z, duplicate = 'mean')
    
    x = mat$x
    y = mat$y
    z = matrix(mat$z, nrow = length(mat$y), byrow = TRUE)
    
    plot_ly(x, y ,z, type = 'surface')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 2019-12-29
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多