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 iteratorsans 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_cycledans les versions <1.5 ou ax.set_prop_cyclerdans> = 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_linesinstance de classe d'assistance. ax._get_linesest une touche qui porte un nom déroutant, mais c'est la machinerie des coulisses qui permet à la plotcommande de traiter toutes les manières étranges et variées qui plotpeuvent ê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_fillfaut 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_cycleconcerne les lignes et les ax._get_patches_for_fill.color_cyclepatchs. Sur matplotlib> = 1.5, cela a changé pour utiliser la cyclerbibliothèque , et l'itérable est appelé à la prop_cyclerplace de color_cycleet donne dictdes 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.5ou plus, il serait bien d'obtenir l' cyclerobjet utilisé, car nous pourrions en déduire son état actuel. Cependant, l' cyclerobjet lui-même n'est accessible (publiquement ou en privé) nulle part. Au lieu de cela, seule l' itertools.cycleinstance créée à partir de l' cyclerobjet 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.