Accès à l'itérateur du cycle des couleurs
Il n'y a pas de méthode "face à l'utilisateur" (c'est-à-dire "publique") pour accéder à l'itérateur sous-jacent, mais vous pouvez y accéder par des méthodes "privées" (par convention). Cependant, vous ne pouvez pas obtenir l'état d'un objet iterator
sans le modifier.
Réglage du cycle des couleurs
Une parenthèse rapide : Vous pouvez définir le cycle couleur/propriété de plusieurs façons (par exemple ax.set_color_cycle
dans les versions <1.5 ou ax.set_prop_cycler
dans >=1.5). Jetez un coup d'œil à la exemple ici pour la version 1.5 ou supérieure ou le style précédent ici .
Accès à l'itérateur sous-jacent
Cependant, bien qu'il n'y ait pas de méthode publique pour accéder à l'itérable, vous pouvez y accéder pour un objet d'axes donné ( ax
) par l'intermédiaire du _get_lines
instance de classe d'aide. ax._get_lines
est un peu confus dans son nom, mais il s'agit de la machinerie en coulisse qui permet à l'équipe de la plot
pour traiter toutes les manières bizarres et variées dont plot
peut être appelé. C'est, entre autres, ce qui permet de savoir quelles couleurs attribuer automatiquement. De même, il y a ax._get_patches_for_fill
pour contrôler le cycle des couleurs de remplissage par défaut et des propriétés du patch.
En tout cas, l'itérable du cycle de couleur est ax._get_lines.color_cycle
pour les lignes et ax._get_patches_for_fill.color_cycle
pour les correctifs. Sur matplotlib >=1.5, cela a changé en utiliser le cycler
bibliothèque et l'itérable s'appelle prop_cycler
au lieu de color_cycle
et donne un dict
de propriétés au lieu d'une seule couleur.
En somme, vous feriez quelque chose comme :
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
color_cycle = ax._get_lines.color_cycle
# or ax._get_lines.prop_cycler on version >= 1.5
# Note that prop_cycler cycles over dicts, so you'll want next(cycle)['color']
Vous ne pouvez pas voir l'état d'une iterator
Cependant, cet objet est un "nu" iterator
. Nous pouvons facilement obtenir l'élément suivant (par ex. next_color = next(color_cycle)
mais cela signifie que la couleur suivante après cela est ce qui sera tracé. Par conception, il n'y a aucun moyen d'obtenir l'état actuel d'un itérateur sans le modifier.
Sur v1.5
ou plus, il serait bon d'obtenir la cycler
qui est utilisé, car nous pourrions déduire son état actuel. Cependant, l'objet cycler
L'objet lui-même n'est accessible (publiquement ou en privé) nulle part. Au lieu de cela, seul le itertools.cycle
créée à partir de l'instance cycler
est accessible. Dans tous les cas, il n'y a aucun moyen d'accéder à l'état sous-jacent du cycleur de couleurs/propriétés.
Faites correspondre la couleur de l'élément précédemment tracé à la place.
Dans votre cas, il semble que vous vouliez faire correspondre la couleur d'un élément qui vient d'être tracé. Au lieu d'essayer de déterminer la couleur/la propriété, définissez la couleur/etc de votre nouvel élément en fonction des propriétés de ce qui est tracé.
Par exemple, dans le cas que vous avez décrit, je ferais quelque chose comme ceci :
import matplotlib.pyplot as plt
import numpy as np
def custom_plot(x, y, **kwargs):
ax = kwargs.pop('ax', plt.gca())
base_line, = ax.plot(x, y, **kwargs)
ax.fill_between(x, 0.9*y, 1.1*y, facecolor=base_line.get_color(), alpha=0.5)
x = np.linspace(0, 1, 10)
custom_plot(x, x)
custom_plot(x, 2*x)
custom_plot(x, -x, color='yellow', lw=3)
plt.show()
Ce n'est pas le seul moyen, mais il est plus propre que d'essayer d'obtenir la couleur de la ligne tracée à l'avance, dans ce cas.