Benutzerdefinierte Mercator-Breitengrad-Skala in Matplotlib

PythonPythonBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Matplotlib ist eine leistungsstarke Datenvisualisierungsbibliothek für Python. Es bietet eine Reihe von integrierten Skalen zum Plotten von Daten, aber manchmal benötigen Sie eine benutzerdefinierte Skala für Ihren speziellen Anwendungsfall. In diesem Lab zeigen wir Ihnen, wie Sie eine benutzerdefinierte Skala erstellen, die die Mercator-Projektion für Längengraddaten verwendet.

VM-Tipps

Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.

Importieren der erforderlichen Bibliotheken

Wir beginnen mit dem Importieren der erforderlichen Bibliotheken.

import numpy as np
from numpy import ma

from matplotlib import scale as mscale
from matplotlib import transforms as mtransforms
from matplotlib.ticker import FixedLocator, FuncFormatter

Definieren der MercatorLatitudeScale-Klasse

Als nächstes definieren wir die Klasse MercatorLatitudeScale, die die benutzerdefinierte Skala implementieren wird. Diese Klasse erbt von mscale.ScaleBase.

class MercatorLatitudeScale(mscale.ScaleBase):
    """
    Skaliert Daten im Bereich von -pi/2 bis pi/2 (-90 bis 90 Grad) unter Verwendung
    des Systems, das zur Skalierung von Breitengraden bei einer Mercator__-Projektion verwendet wird.

    Die Skalenfunktion lautet:
      ln(tan(y) + sec(y))

    Die inverse Skalenfunktion lautet:
      atan(sinh(y))

    Da die Mercator-Skala bei +/- 90 Grad gegen unendlich strebt,
    gibt es einen benutzerdefinierten Schwellenwert, oberhalb und unterhalb dessen
    nichts geplottet wird. Dies ist standardmäßig auf +/- 85 Grad eingestellt.

    __ https://en.wikipedia.org/wiki/Mercator_projection
    """

Implementieren der MercatorLatitudeTransform-Klasse

Innerhalb der MercatorLatitudeScale-Klasse definieren wir die MercatorLatitudeTransform-Klasse, die die Daten tatsächlich transformieren wird. Diese Klasse erbt von mtransforms.Transform.

    class MercatorLatitudeTransform(mtransforms.Transform):
        ## Es gibt zwei Wertmitglieder, die definiert werden müssen.
        ## ``input_dims`` und ``output_dims`` geben die Anzahl der Eingangs-
        ## und Ausgangsdimensionen der Transformation an.
        ## Diese werden vom Transformationsframework verwendet, um einige
        ## Fehlerprüfungen durchzuführen und zu verhindern, dass inkonsistente
        ## Transformationen miteinander verbunden werden. Wenn Transformations-
        ## funktionen für eine Skala definiert werden, die, per Definition,
        ## separierbar und nur eine Dimension haben, sollten diese Mitglieder
        ## immer auf 1 gesetzt werden.
        input_dims = output_dims = 1

        def __init__(self, thresh):
            mtransforms.Transform.__init__(self)
            self.thresh = thresh

        def transform_non_affine(self, a):
            """
            Diese Transformation nimmt ein Numpy-Array und gibt eine transformierte
            Kopie zurück. Da der Bereich der Mercator-Skala durch den
            benutzerdefinierten Schwellenwert begrenzt ist, muss das Eingangs-
            array maskiert werden, um nur gültige Werte zu enthalten. Matplotlib
            wird maskierte Arrays verarbeiten und die außerhalb des Bereichs
            liegenden Daten aus dem Plot entfernen. Allerdings muss das
            zurückgegebene Array *genau* die gleiche Form wie das Eingangs-
            array haben, da diese Werte mit den Werten in der anderen Dimension
            synchron bleiben müssen.
            """
            masked = ma.masked_where((a < -self.thresh) | (a > self.thresh), a)
            if masked.mask.any():
                return ma.log(np.abs(ma.tan(masked) + 1 / ma.cos(masked)))
            else:
                return np.log(np.abs(np.tan(a) + 1 / np.cos(a)))

        def inverted(self):
            """
            Überschreiben Sie diese Methode, damit Matplotlib weiß, wie die
            inverse Transformation für diese Transformation berechnet wird.
            """
            return MercatorLatitudeScale.InvertedMercatorLatitudeTransform(
                self.thresh)

Implementieren der InvertedMercatorLatitudeTransform-Klasse

Wir definieren auch die InvertedMercatorLatitudeTransform-Klasse, die verwendet wird, um die inverse Transformation für diese Skala zu erhalten.

    class InvertedMercatorLatitudeTransform(mtransforms.Transform):
        input_dims = output_dims = 1

        def __init__(self, thresh):
            mtransforms.Transform.__init__(self)
            self.thresh = thresh

        def transform_non_affine(self, a):
            return np.arctan(np.sinh(a))

        def inverted(self):
            return MercatorLatitudeScale.MercatorLatitudeTransform(self.thresh)

Registrieren der benutzerdefinierten Skala

Wir registrieren die benutzerdefinierte Skala bei Matplotlib, indem wir mscale.register_scale verwenden.

mscale.register_scale(MercatorLatitudeScale)

Verwenden der benutzerdefinierten Skala

Jetzt können wir die benutzerdefinierte Skala in unseren Plots verwenden. Hier ist ein Beispiel für die Verwendung der benutzerdefinierten Skala für Breitengraddaten bei einer Mercator-Projektion.

if __name__ == '__main__':
    import matplotlib.pyplot as plt

    t = np.arange(-180.0, 180.0, 0.1)
    s = np.radians(t)/2.

    plt.plot(t, s, '-', lw=2)
    plt.yscale('mercator')

    plt.xlabel('Längengrad')
    plt.ylabel('Breitengrad')
    plt.title('Mercator-Projektion')
    plt.grid(True)

    plt.show()

Zusammenfassung

In diesem Lab haben wir gelernt, wie man in Matplotlib eine benutzerdefinierte Skala mit der Mercator-Projektion für Breitengraddaten erstellt. Wir haben die MercatorLatitudeScale- und MercatorLatitudeTransform-Klassen definiert und die benutzerdefinierte Skala bei Matplotlib mit mscale.register_scale registriert. Wir haben auch ein Beispiel für die Verwendung der benutzerdefinierten Skala für Breitengraddaten bei einer Mercator-Projektion gezeigt.