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.