Python: Finde Konturlinien aus matplotlib.pyplot.contour ()

Ich versuche zu finden (aber nicht zeichnen!) Konturlinien für einige Daten:

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) 

Ich weiß, dass cn die Konturlinien enthält, die ich will, aber ich kann nicht zu ihnen kommen. Ich habe mehrere Dinge ausprobiert:

 print dir(cn) pprint(cn.collections[0]) print dir(cn.collections[0]) pprint(cn.collections[0].figure) print dir(cn.collections[0].figure) 

umsonst. Ich weiß, cn ist ein ContourSet , und cn.collections ist ein Array von LineCollection s. Ich würde denken, dass eine LineCollection ein Array von Liniensegmenten ist, aber ich kann nicht herausfinden, wie man diese Segmente extrahiert.

Mein Ziel ist es, eine KML-Datei zu erstellen, die Daten auf einer Weltkarte und die Konturen für diese Daten aufzeichnet.

Doch da einige meiner Datenpunkte eng beieinander sind und andere weit weg sind, brauche ich die eigentlichen Polygone (Linestringe), die die Konturen ausmachen, nicht nur ein gerastertes Bild der Konturen.

Ich bin etwas überrascht, dass qhull so etwas nicht macht.

Mit Mathematica's ListContourPlot und dann exportieren als SVG funktioniert, aber ich möchte etwas Open Source verwenden.

Ich kann den bekannten CONREC-Algorithmus nicht verwenden, weil meine Daten nicht im Netz sind (es gibt nicht immer mehrfache y-Werte für einen gegebenen x-Wert und umgekehrt).

Die Lösung muss nicht zu python, muss aber Open Source und Runnable auf Linux sein.

  • Voronoi Diagramm Kanten: Wie bekomme ich Kanten in der Form (Punkt 1, Punkt2) aus einem scipy.spatial.Voronoi Objekt?
  • Inverse Distanz gewichtet (IDW) Interpolation mit Python
  • One Solution collect form web for “Python: Finde Konturlinien aus matplotlib.pyplot.contour ()”

    Sie können die Ecken zurück, indem Sie über Sammlungen und Pfade und verwenden Sie die iter_segments() Methode von matplotlib.path.Path .

    Hier ist eine Funktion, die die Ecken als einen Satz von verschachtelten Listen von Konturlinien, Konturabschnitten und Arrays von x, y-Ecken zurückgibt:

     import numpy as np def get_contour_verts(cn): contours = [] # for each contour line for cc in cn.collections: paths = [] # for each separate section of the contour line for pp in cc.get_paths(): xy = [] # for each segment of that section for vv in pp.iter_segments(): xy.append(vv[0]) paths.append(np.vstack(xy)) contours.append(paths) return contours 

    Bearbeiten:

    Es ist auch möglich, die Konturen zu berechnen, ohne etwas mit dem undokumentierten matplotlib._cntr C-Modul zu plotten:

     from matplotlib import pyplot as plt from matplotlib import _cntr as cntr z = np.array([[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]]) x, y = np.mgrid[:z.shape[0], :z.shape[1]] c = cntr.Cntr(x, y, z) # trace a contour at z == 0.5 res = c.trace(0.5) # result is a list of arrays of vertices and path codes # (see docs for matplotlib.path.Path) nseg = len(res) // 2 segments, codes = res[:nseg], res[nseg:] fig, ax = plt.subplots(1, 1) img = ax.imshow(zT, origin='lower') plt.colorbar(img) ax.hold(True) p = plt.Polygon(segments[0], fill=False, color='w') ax.add_artist(p) plt.show() 

    Bildbeschreibung hier eingeben

    Python ist die beste Programmiersprache der Welt.