Échelle personnalisée de latitude Mercator dans Matplotlib

Beginner

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

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.