matplotlib - 从轮廓线提取数据
我想从一组均匀分布的二维数据中获取单条轮廓线的数据(就像图像一样的数据)。
这个问题的例子可以参考这里: 如何获取由轮廓图(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()
调用 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)]
根据这些图,这个结果是合理的,看起来是轮廓线的 (y,x) 坐标对的集合。
除了手动遍历这个返回值,提取坐标并组装成线的数组,还有没有更好的方法从 matplotlib.path
对象中获取数据?在提取 matplotlib.path
数据时,有什么需要注意的地方吗?
另外,matplotlib
内部有没有其他方法,或者更好的选择是 numpy
/scipy
来做类似的事情?理想情况下,我希望能得到一组高分辨率的 (x,y) 坐标对,描述这条线,以便进行进一步分析,因为我的数据集通常没有上面的例子那么小或简单。
4 个回答
所有路径的顶点可以简单地通过一个numpy数组返回,数据类型为float64,方法如下:
cs.allsegs[i][j] # for element j, in level i
这里的 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])
更详细的说明:
遍历集合并提取路径和顶点并不是最简单或最快的方法。实际上,返回的轮廓对象有一个属性可以直接获取这些段,使用 cs.allsegs
,它会返回一个嵌套列表,格式为 [层级][元素][顶点坐标]:
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
来自:http://matplotlib.org/api/path_api.html#module-matplotlib.path
使用Path对象的用户不应该直接访问顶点和代码数组。相反,应该使用iter_segments()来获取顶点和代码的配对。这一点很重要,因为很多Path对象为了优化,根本不存储代码,而是由iter_segments()提供一个默认的代码。
除此之外,我不太确定你的问题是什么。[Zip]是一个在处理坐标时有时会用到的内置函数。1
对于一个给定的路径,你可以这样获取点:
p = cs.collections[0].get_paths()[0]
v = p.vertices
x = v[:,0]
y = v[:,1]