matplotlib – 从等高线中提取数据

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

基于类似问题中find的示例: 如何获得由等值线图(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中有没有其他的select,或更好的numpy / scipy来做类似的事情? 理想的情况是获得(x,y)对的高分辨率向量,描述这条线,可以用于进一步的分析,因为一般来说,我的数据集不是一个小的或简单的例子。

对于给定的path,你可以得到像这样的点:

 p = cs.collections[0].get_paths()[0] v = p.vertices x = v[:,0] y = v[:,1] 

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

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

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

我面临着类似的问题,并偶然发现了这个matplotlib列表的讨论 。

基本上可以直接去掉绘图和调用底层函数,不是非常方便,而是可能的。 该解决scheme也不是像素精确的,因为底层代码中可能会有一些插值。

 import matplotlib.pyplot as plt import matplotlib._cntr as cntr import scipy as sp data = sp.zeros((6,6)) data[2:4,2:4] = 1 plt.imshow(data,interpolation='none') level=0.5 X,Y = sp.meshgrid(sp.arange(data.shape[0]),sp.arange(data.shape[1])) c = cntr.Cntr(X, Y, data.T) nlist = c.trace(level, level, 0) segs = nlist[:len(nlist)//2] for seg in segs: plt.plot(seg[:,0],seg[:,1],color='white') plt.show()