Accéder à l'itérateur du cycle de couleurs
Il n'y a pas de méthode "face à l'utilisateur" (aka "public") pour accéder à l'itérateur sous-jacent, mais vous pouvez y accéder via des méthodes "privées" (par convention). Cependant, vous ne pouvez pas obtenir l'état d'un iterator
sans le changer.
Définition du cycle de couleur
Mise à part rapide: Vous pouvez définir le cycle couleur / propriété de différentes manières (par exemple ax.set_color_cycle
dans les versions <1.5 ou ax.set_prop_cycler
dans> = 1.5). Jetez un œil à l' exemple ici pour la version 1.5 ou supérieure , ou au style précédent ici .
Accéder à 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 axes donné ( ax
) via l' _get_lines
instance de classe d'assistance. ax._get_lines
est une touche qui porte un nom déroutant, mais c'est la machinerie des coulisses qui permet à la plot
commande de traiter toutes les manières étranges et variées qui plot
peuvent être appelées. Entre autres choses, c'est ce qui garde une trace des couleurs à attribuer automatiquement. De même, il ax._get_patches_for_fill
faut contrôler le cycle des couleurs de remplissage par défaut et des propriétés de patch.
Dans tous les cas, le cycle de couleur itérable ax._get_lines.color_cycle
concerne les lignes et les ax._get_patches_for_fill.color_cycle
patchs. Sur matplotlib> = 1.5, cela a changé pour utiliser la cycler
bibliothèque , et l'itérable est appelé à la prop_cycler
place de color_cycle
et donne dict
des propriétés au lieu d'une seule couleur.
Dans l'ensemble, vous feriez quelque chose comme:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
color_cycle = ax._get_lines.color_cycle
Vous ne pouvez pas afficher l'état d'un iterator
Cependant, cet objet est un "nu" iterator
. Nous pouvons facilement obtenir l'élément suivant (par exemple next_color = next(color_cycle)
, mais cela signifie que la couleur suivante est celle qui sera tracée. De par sa conception, il n'y a aucun moyen d'obtenir l'état actuel d'un itérateur sans le changer.
Dans v1.5
ou plus, il serait bien d'obtenir l' cycler
objet utilisé, car nous pourrions en déduire son état actuel. Cependant, l' cycler
objet lui-même n'est accessible (publiquement ou en privé) nulle part. Au lieu de cela, seule l' itertools.cycle
instance créée à partir de l' cycler
objet est accessible. Dans tous les cas, il n'y a aucun moyen d'accéder à l'état sous-jacent du cycleur couleur / propriété.
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 de quelque chose qui vient d'être tracé. Au lieu d'essayer de déterminer quelle sera 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 c'est plus propre que d'essayer d'obtenir la couleur de la ligne tracée à l'avance, dans ce cas.