Introduction
Matplotlib est une puissante bibliothèque de visualisation de données pour Python. Elle fournit un certain nombre d'échelles intégrées pour tracer des données, mais parfois vous pouvez avoir besoin d'une échelle personnalisée pour votre cas d'utilisation spécifique. Dans ce laboratoire, nous allons vous montrer comment créer une échelle personnalisée qui utilise la projection Mercator pour les données de latitude.
Conseils sur la machine virtuelle
Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder au carnet Jupyter pour pratiquer.
Parfois, vous devrez peut-être attendre quelques secondes pour que le carnet Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet Jupyter.
Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous réglerons rapidement le problème pour vous.
Importez les bibliothèques nécessaires
Nous allons commencer par importer les bibliothèques nécessaires.
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
Définissez la classe MercatorLatitudeScale
Ensuite, nous allons définir la classe MercatorLatitudeScale qui implémentera l'échelle personnalisée. Cette classe héritera de mscale.ScaleBase.
class MercatorLatitudeScale(mscale.ScaleBase):
"""
Échelle les données dans la plage -pi/2 à pi/2 (-90 à 90 degrés) en utilisant
le système utilisé pour échelle les latitudes dans une projection Mercator__.
La fonction d'échelle :
ln(tan(y) + sec(y))
La fonction d'échelle inverse :
atan(sinh(y))
Étant donné que l'échelle Mercator tend vers l'infini à +/- 90 degrés,
il existe un seuil défini par l'utilisateur, au-dessus et en-dessous duquel rien
ne sera tracé. Cela est par défaut à +/- 85 degrés.
__ https://en.wikipedia.org/wiki/Mercator_projection
"""
Implémentez la classe MercatorLatitudeTransform
Dans la classe MercatorLatitudeScale, nous allons définir la classe MercatorLatitudeTransform qui transformera réellement les données. Cette classe héritera de mtransforms.Transform.
class MercatorLatitudeTransform(mtransforms.Transform):
## Il existe deux membres de valeur qui doivent être définis.
## ``input_dims`` et ``output_dims`` spécifient le nombre de dimensions
## d'entrée et de dimensions de sortie de la transformation.
## Ces informations sont utilisées par le cadre de transformation pour
## effectuer certaines vérifications d'erreur et empêcher les
## transformations incompatibles d'être connectées ensemble. Lors de
## la définition de transformations pour une échelle, qui sont, par
## définition, séparables et n'ont qu'une seule dimension, ces
## membres devraient toujours être définis sur 1.
input_dims = output_dims = 1
def __init__(self, thresh):
mtransforms.Transform.__init__(self)
self.thresh = thresh
def transform_non_affine(self, a):
"""
Cette transformation prend un tableau numpy et renvoie une copie transformée.
Étant donné que la plage de l'échelle Mercator est limitée par le
seuil spécifié par l'utilisateur, le tableau d'entrée doit être masqué
pour ne contenir que des valeurs valides. Matplotlib gérera les tableaux
masqués et supprimera les données en dehors de la plage du tracé.
Cependant, le tableau renvoyé *doit* avoir la même forme que le
tableau d'entrée, car ces valeurs doivent rester synchronisées avec
les valeurs dans l'autre dimension.
"""
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):
"""
Redéfinissez cette méthode pour que Matplotlib sache comment obtenir
la transformation inverse de cette transformation.
"""
return MercatorLatitudeScale.InvertedMercatorLatitudeTransform(
self.thresh)
Implémentez la classe InvertedMercatorLatitudeTransform
Nous allons également définir la classe InvertedMercatorLatitudeTransform qui sera utilisée pour obtenir la transformation inverse de cette échelle.
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)
Enregistrez l'échelle personnalisée
Nous allons enregistrer l'échelle personnalisée avec Matplotlib en utilisant mscale.register_scale.
mscale.register_scale(MercatorLatitudeScale)
Utilisez l'échelle personnalisée
Maintenant, nous pouvons utiliser l'échelle personnalisée dans nos tracés. Voici un exemple d'utilisation de l'échelle personnalisée pour les données de latitude dans une projection Mercator.
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('Longitude')
plt.ylabel('Latitude')
plt.title('Projection Mercator')
plt.grid(True)
plt.show()
Sommaire
Dans ce laboratoire, nous avons appris à créer une échelle personnalisée dans Matplotlib en utilisant la projection Mercator pour les données de latitude. Nous avons défini les classes MercatorLatitudeScale et MercatorLatitudeTransform et enregistré l'échelle personnalisée avec Matplotlib en utilisant mscale.register_scale. Nous avons également montré un exemple d'utilisation de l'échelle personnalisée pour les données de latitude dans une projection Mercator.