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:

  • Sortierung von Konturen nach rechts in Python (OpenCV)
  • Python - Probleme Kontur Plotten Offset Gitter von Daten
  • Wie kann ich den Bereich innerhalb einer Kontur in Python mit dem Matplotlib berechnen?
  • Erstellen Sie Konturplot von Pandas Groupby Dataframe
  • Opencv mit Python: pointPolygonTest gibt offensichtlich falsches Ergebnis
  • Python matplotlib Kontur Plot logarithmische Farbskala
  •  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.

  • Wie schreibe ich Binär- und Asci-Daten in eine Datei in Python?
  • Python, Pairwise 'Distanz', brauchen einen schnellen Weg, es zu tun
  • Wie lese ich Bits aus einer Datei?
  • Datei zum Lesen und Schreiben öffnen?
  • Wie kann ich feststellen, ob eine Datei binär ist (non-text) in python?
  • Holen Sie sich den ROI von zwei Binärbildern und finden Sie den Unterschied der mittleren Bild-Intesitäten zwischen 2 ROI in 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.