matplotlib - 从轮廓线中提取数据

dtl*_*ier 49 python numpy matplotlib contour scipy

我想从均匀间隔的2D数据(类似图像的数据)的单个轮廓获取数据.

基于类似问题中的示例:如何获得由等高线图(matplotlib)绘制的线的(x,y)值?

>>> import matplotlib.pyplot as plt
>>> x = [1,2,3,4]
>>> y = [1,2,3,4]
>>> m = [[15,14,13,12],[14,12,10,8],[13,10,7,4],[12,8,4,0]]
>>> cs = plt.contour(x,y,m, [9.5])
>>> cs.collections[0].get_paths()
Run Code Online (Sandbox Code Playgroud)

这次调用的结果cs.collections[0].get_paths()是:

[Path([[ 4.          1.625     ]
 [ 3.25        2.        ]
 [ 3.          2.16666667]
 [ 2.16666667  3.        ]
 [ 2.          3.25      ]
 [ 1.625       4.        ]], None)]
Run Code Online (Sandbox Code Playgroud)

基于这些图,这个结果是有意义的,并且似乎是轮廓线的(y,x)对的集合.

除了手动循环这个返回值,提取坐标和组合线的数组,是否有更好的方法从matplotlib.path对象获取数据?从数据中提取数据时是否存在需要注意的陷阱matplotlib.path

或者,有没有替代品matplotlib或更好numpy/ scipy做类似的事情?理想的是获得描述该线的(x,y)对的高分辨率矢量,可用于进一步分析,因为通常我的数据集不像上面的例子那么小或简单.

so1*_*311 47

对于给定的路径,您可以获得如下所示的点:

p = cs.collections[0].get_paths()[0]
v = p.vertices
x = v[:,0]
y = v[:,1]
Run Code Online (Sandbox Code Playgroud)


Per*_*ure 9

来自:http://matplotlib.org/api/path_api.html#module-matplotlib.path

Path对象的用户不应直接访问顶点和代码数组.相反,他们应该使用iter_segments()来获取顶点/代码对.这很重要,因为许多Path对象作为优化,根本不存储代码,但是iter_segments()为它们提供了默认代码.

否则,我不确定你的问题是什么.使用坐标时,[Zip]有时是有用的内置函数.1


RCC*_*CCG 7

所有路径的顶点可以简单地通过以下方式作为 float64 的 numpy 数组返回:

cs.allsegs[i][j]  # for element j, in level i
Run Code Online (Sandbox Code Playgroud)

其中cs在原始问题中定义为:

import matplotlib.pyplot as plt
x = [1, 2, 3, 4]
y = [1, 2, 3, 4]
m = [[15, 14, 13, 12], [14, 12, 10, 8], [13, 10, 7, 4], [12, 8, 4, 0]]
cs = plt.contour(x, y, m, [9.5])
Run Code Online (Sandbox Code Playgroud)

更详细:

遍历集合并提取路径和顶点并不是最直接或最快的事情。返回的 Contour 对象实际上具有 via 段的属性cs.allsegs,它返回形状 [level][element][vertex_coord] 的嵌套列表:

num_levels = len(cs.allsegs)
num_element = len(cs.allsegs[0])  # in level 0
num_vertices = len(cs.allsegs[0][0])  # of element 0, in level 0
num_coord = len(cs.allsegs[0][0][0])  # of vertex 0, in element 0, in level 0
Run Code Online (Sandbox Code Playgroud)

请参阅参考: https: //matplotlib.org/stable/api/contour_api.html