我正在寻找(但不是画!)某些数据的等高线:
from pprint import pprint
import matplotlib.pyplot
z = [[0.350087, 0.0590954, 0.002165], [0.144522, 0.885409, 0.378515],
[0.027956, 0.777996, 0.602663], [0.138367, 0.182499, 0.460879],
[0.357434, 0.297271, 0.587715]]
cn = matplotlib.pyplot.contour(z)
我知道cn
包含我想要的轮廓线,但我似乎无法得到它们。我试过几种方法:
print dir(cn)
pprint(cn.collections[0])
print dir(cn.collections[0])
pprint(cn.collections[0].figure)
print dir(cn.collections[0].figure)
但毫无结果我知道cn
是一个ContourSet
,cn.collections
是一个LineCollection
s的数组。我认为LineCollection
是一个线段数组,但我不知道如何提取这些线段。
我的最终目标是创建一个KML文件,在世界Map上绘制数据,以及这些数据的轮廓。
然而,由于我的一些数据点靠得很近,而另一些数据点离得很远,所以我需要组成轮廓的实际多边形(线串),而不仅仅是轮廓的栅格化图像。
我有点惊讶qhull
没有做这样的事情。
使用Mathematica的ListContourPlot
,然后导出为SVG工作,但我想使用开源的东西。
我不能使用著名的CONREC算法,因为我的数据不在网格上(给定的x值并不总是有多个y值,反之亦然)。
解决方案不一定要使用python,但必须是开源的,并且可以在Linux上运行。
4条答案
按热度按时间ds97pgxw1#
您可以通过循环遍历集合和路径并使用
matplotlib.path.Path
的iter_segments()
方法来获取顶点。这里有一个函数,它返回顶点作为一组嵌套的轮廓线列表,轮廓截面和x,y顶点数组:
编辑:
也可以使用未文档化的
matplotlib._cntr
C模块计算轮廓而不绘制任何内容:cgh8pdjw2#
我建议使用scikit-image find_contours
它返回给定标高的等高线列表。
matplotlib._cntr
从matplotlib v2.2起被移除(参见here)。epfja78i3#
轮廓数据似乎位于
plt.contour()
函数返回的QuadContourSet
对象的.allsegs
属性中。.allseg
属性是所有级别的列表(可以在调用plt.contour(X,Y,Z,V)
时指定)。对于每个级别,您将获得 n x 2 NumPy数组的列表。在上面的例子中,只给出了一个水平,所以
len(C.allsegs)
= 1。你得到:等高线图
提取的曲线
vfh0ocws4#
所有路径的顶点可以简单地通过以下方式作为float64的numpy数组返回:
其中
cn
定义为原始问题:更详细:
遍历集合并提取路径和顶点并不是最直接或最快的事情。返回的Contour对象实际上通过
cs.allsegs
具有片段的属性,它返回shape [level][element][vertex_coord]的嵌套列表:参见参考文献:https://matplotlib.org/3.1.1/api/contour_api.html