Comment faire #

Pourquoi ai-je autant de ticks et/ou pourquoi sont-ils hors service ? #

Une cause courante de comportement inattendu des ticks est la transmission d'une liste de chaînes au lieu de nombres ou d'objets datetime . Cela peut facilement se produire sans préavis lors de la lecture d'un fichier texte délimité par des virgules. Matplotlib traite les listes de chaînes comme des variables catégorielles ( Plotting categorical variables ), et met par défaut une coche par catégorie, et les trace dans l'ordre dans lequel elles sont fournies.

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(1, 2, constrained_layout=True, figsize=(6, 2))

ax[0].set_title('Ticks seem out of order / misplaced')
x = ['5', '20', '1', '9']  # strings
y = [5, 20, 1, 9]
ax[0].plot(x, y, 'd')
ax[0].tick_params(axis='x', labelcolor='red', labelsize=14)

ax[1].set_title('Many ticks')
x = [str(xx) for xx in np.arange(100)]  # strings
y = np.arange(100)
ax[1].plot(x, y)
ax[1].tick_params(axis='x', labelcolor='red', labelsize=14)

( Code source , png )

../../_images/howto_faq-1.png

La solution consiste à convertir la liste des chaînes en nombres ou en objets datetime (souvent ou ).np.asarray(numeric_strings, dtype='float')np.asarray(datetime_strings, dtype='datetime64[s]')

Pour plus d'informations, voir Corriger trop de ticks .

Déterminer l'étendue des artistes dans la figure #

Parfois, nous voulons connaître l'étendue d'un artiste. Les objets Matplotlib Artistont une méthode Artist.get_window_extentqui renverra généralement l'étendue de l'artiste en pixels. Cependant, certains artistes, en particulier le texte, doivent être rendus au moins une fois avant que leur étendue ne soit connue. Matplotlib fournit Figure.draw_without_rendering, qui doit être appelé avant d'appeler get_window_extent.

Vérifier si un chiffre est vide #

Vide peut en fait signifier différentes choses. La figure contient-elle des artistes ? Une figure avec un vide Axescompte-t-elle comme vide ? La figure est-elle vide si elle a été rendue en blanc pur (il peut y avoir des artistes présents, mais ils peuvent être en dehors de la zone de dessin ou transparents) ?

Dans le but ici, nous définissons vide comme : "La figure ne contient aucun artiste à l'exception de son patch d'arrière-plan." L'exception pour l'arrière-plan est nécessaire, car par défaut chaque figure contient un Rectanglepatch d'arrière-plan. Cette définition peut être vérifiée via :

def is_empty(figure):
    """
    Return whether the figure contains no Artists (other than the default
    background patch).
    """
    contained_artists = figure.get_children()
    return len(contained_artists) <= 1

Nous avons décidé de ne pas l'inclure comme méthode de figure car ce n'est qu'une façon de définir vide, et vérifier ce qui précède n'est que rarement nécessaire. Habituellement, l'utilisateur ou le programme qui gère la figure sait s'il a ajouté quelque chose à la figure.

Vérifier si une figure serait rendue vide ne peut pas être vérifié de manière fiable, sauf en rendant réellement la figure et en examinant le résultat rendu.

Trouver tous les objets dans une figure d'un certain type #

Chaque artiste Matplotlib (voir Artist tutorial ) a une méthode appelée findobj()qui peut être utilisée pour rechercher de manière récursive l'artiste pour tous les artistes qu'il peut contenir et qui répondent à certains critères (par exemple, correspondre à toutes les Line2D instances ou correspondre à une fonction de filtre arbitraire). Par exemple, l'extrait de code suivant trouve chaque objet de la figure qui possède une set_colorpropriété et rend l'objet bleu :

def myfunc(x):
    return hasattr(x, 'set_color')

for o in fig.findobj(myfunc):
    o.set_color('blue')

Vous pouvez également filtrer sur les instances de classe :

import matplotlib.text as text
for o in fig.findobj(text.Text):
    o.set_fontstyle('italic')

Empêcher les ticklabels d'avoir un décalage #

Le formateur par défaut utilisera un décalage pour réduire la longueur des ticklabels. Pour désactiver cette fonctionnalité par axe :

ax.get_xaxis().get_major_formatter().set_useOffset(False)

set rcParams["axes.formatter.useoffset"](par défaut : True), ou utilisez un formateur différent. Voir tickerpour plus de détails.

Enregistrer les chiffres transparents #

La savefig()commande a un argument mot-clé transparent qui, si 'True', rendra les arrière-plans de la figure et des axes transparents lors de l'enregistrement, mais n'affectera pas l'image affichée à l'écran.

Si vous avez besoin d'un contrôle plus fin, par exemple si vous ne souhaitez pas une transparence totale ou si vous souhaitez également affecter la version affichée à l'écran, vous pouvez définir directement les propriétés alpha. La figure a une Rectangleinstance appelée patch et les axes ont une instance Rectangle appelée patch . Vous pouvez définir directement n'importe quelle propriété dessus ( facecolor , edgecolor , linewidth , linestyle , alpha ). par exemple:

fig = plt.figure()
fig.patch.set_alpha(0.5)
ax = fig.add_subplot(111)
ax.patch.set_alpha(0.5)

Si vous avez besoin que tous les éléments de la figure soient transparents, il n'existe actuellement aucun paramètre alpha global, mais vous pouvez définir le canal alpha sur des éléments individuels, par exemple :

ax.plot(x, y, alpha=0.5)
ax.set_xlabel('volts', alpha=0.5)

Enregistrer plusieurs tracés dans un seul fichier pdf #

De nombreux formats de fichiers image ne peuvent avoir qu'une seule image par fichier, mais certains formats prennent en charge les fichiers multipages. Actuellement, Matplotlib fournit uniquement une sortie multi-pages vers des fichiers pdf, en utilisant les backends pdf ou pgf, via les classes backend_pdf.PdfPageset .backend_pgf.PdfPages

Faites de la place pour les étiquettes de tiques #

Par défaut, Matplotlib utilise des marges de pourcentage fixes autour des sous-parcelles. Cela peut entraîner le chevauchement ou la coupure des étiquettes à la limite de la figure. Il existe plusieurs façons de résoudre ce problème :

Aligner mes ylabels sur plusieurs sous-parcelles #

Si vous avez plusieurs sous-parcelles les unes sur les autres et que les données y ont des échelles différentes, vous pouvez souvent obtenir des étiquettes y qui ne s'alignent pas verticalement sur les multiples sous-parcelles, ce qui peut être peu attrayant. Par défaut, Matplotlib positionne l'emplacement x du ylabel de sorte qu'il ne chevauche aucune des graduations y. Vous pouvez remplacer ce comportement par défaut en spécifiant les coordonnées de l'étiquette. L'exemple ci-dessous montre le comportement par défaut dans les sous-parcelles de gauche et le réglage manuel dans les sous-parcelles de droite.

../../_images/sphx_glr_align_ylabels_001.png

Contrôlez l'ordre de dessin des éléments de tracé #

L'ordre d'affichage des éléments de tracé, et donc quels éléments seront au-dessus, est déterminé par la set_zorderpropriété. Voir la démo Zorder pour une description détaillée.

Rendre le rapport d'aspect pour les tracés égal #

La propriété Axes set_aspect()contrôle le rapport d'aspect des axes. Vous pouvez le définir sur 'auto', 'equal' ou un ratio qui contrôle le ratio :

ax = fig.add_subplot(111, aspect='equal')

Voir Rapport d' aspect d'axe égal pour un exemple complet.

Dessiner plusieurs échelles d'axe y #

Une demande fréquente est d'avoir deux échelles pour l'axe y gauche et droit, ce qui est possible en utilisant twinx()(plus de deux échelles ne sont actuellement pas prises en charge, bien qu'elles soient sur la liste de souhaits). Cela fonctionne plutôt bien, bien qu'il y ait quelques bizarreries lorsque vous essayez de faire un panoramique et un zoom interactifs, car les deux échelles ne reçoivent pas les signaux.

L'approche utilise twinx()(et sa sœur twiny()) pour utiliser 2 axes différents , en désactivant le cadre rectangulaire des axes sur les 2èmes axes pour l'empêcher d'obscurcir le premier, et en définissant manuellement les locs et les étiquettes de tiques comme vous le souhaitez. Vous pouvez utiliser des matplotlib.tickerformateurs et des localisateurs distincts comme vous le souhaitez car les deux axes sont indépendants.

( Code source , png )

../../_images/howto_faq-2.png

Voir Parcelles avec différentes échelles pour un exemple complet.

Générer des images sans faire apparaître de fenêtre #

N'appelez simplement pas show, et enregistrez directement la figure au format souhaité :

import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.savefig('myfig.png')

Voir également

Intégration dans un serveur d'applications Web (Flask) pour obtenir des informations sur l'exécution de matplotlib dans une application Web.

Travailler avec des fils #

Matplotlib n'est pas thread-safe : en fait, il existe des conditions de concurrence connues qui affectent certains artistes. Par conséquent, si vous travaillez avec des threads, il est de votre responsabilité de configurer les verrous appropriés pour sérialiser l'accès aux artistes Matplotlib.

Vous pourrez peut-être travailler sur des figures distinctes à partir de fils distincts. Cependant, vous devez dans ce cas utiliser un backend non interactif (généralement Agg), car la plupart des backends GUI nécessitent également d' être exécutés à partir du thread principal.