边界内插遮罩

4

我想生成一个关于Z值梯度的热力图,使用Plotly显示。

我的问题在于如何有效地遮罩那些在“凹陷”区域中由插值产生的无用数据,这些区域没有数据点。

1个回答

1

一种解决方案(可能不是最优雅的)是找到点的边界(凸包),然后将边界外的任何内容设置为nan

要查找边界,您可以使用alphashape,并使用shapely确定grid_z点是否在边界内(或上)。

这里有一个示例,直接在第一个Plotly图之前展示:

from shapely.geometry import Polygon, Point
import alphashape

mpoints = [Point(X, Y) for X, Y in zip(x, y)]

alpha=.125
hull = alphashape.alphashape(mpoints, alpha)
poly = Polygon(hull)

grid_gz = grid_z
gx = np.arange(min(x), max(x),1)
gy = np.arange(min(y), max(y),1)
for i, gxi in enumerate(gx):
    for j, gyi in enumerate(gy):
        if not np.isnan(grid_gz[j,i]): #UPDATE: no need to test pts that are already NaN
            p1 = Point(gxi, gyi)
            test = poly.contains(p1) | poly.touches(p1)
            if test==False:
                grid_gz[j,i]=np.nan

fig = go.Figure()

fig.add_trace(
    go.Heatmap(z=grid_gz,x0=min(x),y0=min(y),showscale=True, zsmooth='best', 
               connectgaps=False, colorscale='Hot'
               ))

fig.add_trace(
    go.Scatter(
        x=x,
        y=y,mode="markers",marker_size=2,marker_color="black",
    ))

fig.update_layout(
    width = 1200,
    height = 1200,
    title = "Gradient Heatmap Plot",
    yaxis = dict(
      scaleanchor = "x",
      scaleratio = 1,
    ))

fig.show()

补充说明:

  • 最终我手动选择了alpha值。你可以使用optimizealpha来找到alpha值,但是这个值过于粗糙,热力图的一侧出现了台阶。在这里也可以看到。
  • 关于alphashape,更多信息可以在这里找到。
  • 关于shapely的contains,更多信息可以在这里找到,关于touches,更多信息可以在这里找到。

enter image description here


1
哇,非常感谢Jayveesea!这对我帮助很大!我真的很感激! - Morgs
1
如果我有时间,我可能会发布更新,但我认为通过仅测试非NaN的grid_z结果可以改进这个。 - jayveesea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接