我想从均匀分布的2D数据(类似图像的数据)的单个轮廓中获取数据。
根据在一个类似问题中发现的例子:How can I get the (x,y) values of the line that is ploted by a contour plot (matplotlib)?
>>> 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条答案
按热度按时间zvokhttg1#
对于给定的路径,您可以获得如下所示的点:
9rnv2umw2#
来自:http://matplotlib.org/api/path_api.html#module-matplotlib.path
Path对象的用户不应该直接访问顶点和代码数组。相反,他们应该使用iter_segments()来获取顶点/代码对。这一点很重要,因为作为优化,许多Path对象根本不存储代码,而是由iter_segments()为它们提供一个默认代码。
除此之外,我真的不确定你的问题是什么。[Zip]是一个内置函数,在处理坐标时有时很有用。1
wecizke33#
所有路径的顶点可以作为float64的numpy数组返回,只需通过:
其中,
cs
的定义与原始问题中的定义相同:详细信息:
遍历集合并提取路径和顶点并不是最直接或最快的事情。返回的Contour对象实际上通过
cs.allsegs
具有线段的属性,cs.allsegs
返回一个嵌套的shape [level][element][vertex_coord]列表:参见参考文献:https://matplotlib.org/stable/api/contour_api.html
fzsnzjdm4#
我也面临着类似的问题,并在this matplotlib list discussion上栽了跟头。
基本上,可以去掉绘图,直接调用底层函数,虽然不是很方便,但也是可能的。解决方案也不是像素精确的,因为底层代码中可能有一些插值。