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 )
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 Artist
ont une méthode Artist.get_window_extent
qui 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 Axes
compte-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 Rectangle
patch 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_color
proprié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 ticker
pour 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
Rectangle
instance 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.PdfPages
et .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 :
Adaptez manuellement les paramètres de la sous-parcelle à l'aide de
Figure.subplots_adjust
/pyplot.subplots_adjust
.Utilisez l'un des mécanismes de mise en page automatique :
mise en page contrainte ( Guide de mise en page contrainte )
mise en page serrée ( guide de mise en page serrée )
Calculez vous-même les bonnes valeurs à partir de la taille des éléments de l'intrigue ( contrôle par programme de l'ajustement de l'intrigue secondaire )
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.
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_zorder
proprié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.ticker
formateurs et des localisateurs distincts comme vous le souhaitez car les deux axes sont indépendants.
( Code source , 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.