我有二维离散空间数据。我想对这些数据的空间边界进行近似,这样我就可以生成一个带有另一个数据集的图。
理想情况下,这将是 matplotlib 可以使用 plt.Polygon() 补丁绘制的一组有序 (x,y) 点。
我最初的尝试非常不优雅:我在数据上放置了一个精细的网格,并且在单元格中找到数据的地方,从该单元格创建了一个方形 matplotlib 补丁。因此,边界的分辨率取决于网格的采样频率。这是一个示例,其中灰色区域是包含数据的单元格,黑色区域是不存在数据的单元格。
第一次尝试 http://astro.dur.ac.uk/~dmurphy/data_limits.png
好的,问题解决了——为什么我还在这里?嗯....我想要一个更“优雅”的解决方案,或者至少一个更快的解决方案(即。我不想继续“真正的”工作,我想从中获得一些乐趣!)。我能想到的最好方法是光线追踪方法 - 例如:
- 从 xmin 到 xmax,在 y=ymin,检查数据边界是否在间隔 dx 中交叉
- y=ymin+dy,做 1
- 做 1-2,但现在在 y 中采样
另一种方法是定义一个中心,并在 r-theta 空间中采样 - 即 dtheta 增量中的径向辐条。
两者都会产生一组(x,y)点,但是我如何排序/链接相邻点以创建边界?
最近邻方法是不合适的,例如(借用地理),地峡(想想连接 N&S America 的巴拿马)然后可以关闭和隔离区域。这也可能无法很好地处理数据中看到的漏洞,我想将其表示为不同的 plt.Polygon。
解决方案可能来自解决面积最大化问题。对于定义数据限制的一组点,这些点中包含的最大连续区域是多少为了形成封闭区域,第 n 个点的相邻点是多少?在这个方案中将如何处理这些漏洞 - 现在这是否会导致拓扑错误?
抱歉,这大部分是我大声思考的。对于一些提示、建议或解决方案,我将不胜感激。我怀疑这是许多解决方案技术经常研究的问题,但我正在寻找一些简单的代码和快速运行的东西......我想每个人都是,真的!
~~~~~~~~~~~~~~~~~~~~~~~~~
好的,这是使用 Mark 的凸包概念的尝试 #2: 替代文本 http://astro.dur.ac.uk/~dmurphy/data_limitsv2.png
为此,我使用了 qhull 包中的 qconvex,让它返回极端顶点。对于那些感兴趣的人:
猫 [数据] | qconvex Fx > out
周边的采样似乎很低,虽然我没有玩太多设置,但我不相信我可以提高保真度。