Obtenir matplotlib couleur cycle d'état
Est-il possible d'interroger l'état actuel de la matplotlib couleur de cycle? En d'autres termes est-il une fonction get_cycle_state
qui se comportent de la manière suivante?
>>> plot(x1, y1)
>>> plot(x2, y2)
>>> state = get_cycle_state()
>>> print state
2
Où j'attends l'état à l'index de la couleur suivante, qui sera utilisé dans une parcelle. Sinon, si il est revenu le lendemain de couleur ("r" pour le cycle par défaut dans l'exemple ci-dessus), qui serait bien aussi.
Vous devez vous connecter pour publier un commentaire.
Accès à la couleur cycle d'itérateur
Il n'y a pas de "l'utilisateur-face" (un.k.un. "public") la méthode pour accéder au sous-jacente itérateur, mais vous pouvez y accéder par le biais de "privé" (par convention) des méthodes. Cependant, vous feriez peut pas obtenir l'état d'un
iterator
sans la modifier.Réglage de la couleur de cycle
Rapide de côté: Vous pouvez définir la couleur et de la propriété cycle dans une variété de façons (p. ex.
ax.set_color_cycle
dans les versions <1,5 ouax.set_prop_cycler
dans >=1.5). Jetez un oeil à la exemple ici pour la version 1.5 ou plus, ou le de style précédentes ici.Accès à la sous-jacentes itérateur
Cependant, il n'y a pas de public en face de la méthode pour accéder à l'objet iterable, vous pouvez y accéder pour un des axes de l'objet (
ax
) par le biais de la_get_lines
helper instance de classe.ax._get_lines
est une touche prêter à confusion du nom, mais c'est le derrière-le-scènes de la machinerie qui permet à l'plot
commande de traitement de tous les bizarres et variées des moyens qu'plot
peut être appelé. Entre autres choses, c'est ce qui garde la trace de ce que les couleurs que pour attribuer automatiquement. De même, il n'y aax._get_patches_for_fill
pour contrôler le vélo par défaut, les couleurs de remplissage et de patch propriétés.En tout cas, la couleur de cycle itératif est
ax._get_lines.color_cycle
pour les lignes et lesax._get_patches_for_fill.color_cycle
pour les patchs. Sur matplotlib >=1.5, cela a changé à utilisation de l'option- cycleur
de la bibliothèque, et l'itérable est appeléprop_cycler
au lieu decolor_cycle
et donne undict
de propriétés, au lieu de seulement une couleur.Dans l'ensemble, vous feriez quelque chose comme:
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 prochaine couleur après que est ce qui va être tracée. De par sa conception, il n'y a aucun moyen d'obtenir l'état actuel d'un itérateur sans la modifier.Dans
v1.5
ou plus, il serait bien d'obtenir lecycler
objet qui est utilisé, comme nous avons pu en déduire son état actuel. Cependant, lacycler
objet lui-même n'est pas accessible (public ou privé) n'importe où. Au lieu de cela, seuls lesitertools.cycle
instance créée à partir de lacycler
objet est accessible. De toute façon, il n'y a aucun moyen d'obtenir de l'état sous-jacent de la couleur et de la propriété du cycleur.Correspondre à la couleur de la déjà tracées élément au lieu
Dans votre cas, il semble que vous êtes désireux de faire correspondre la couleur de quelque chose qui vient d'être tracée. Au lieu d'essayer de déterminer ce que la couleur de la propriété sera, définir la couleur/etc de votre nouvel élément basé sur les propriétés de ce qui est tracé.
Par exemple, dans le cas que vous avez décrit, je ferais quelque chose comme ceci:
Ce n'est pas le seul moyen, mais son plus propre que d'essayer d'obtenir la couleur de la ligne tracée à l'avance, dans ce cas.
line, = ax.plot(x, y)
et ensuite utiliserline.get_color()
d'obtenir la couleur de la précédemment tracé de la ligne.**kwargs
, cela rend les choses beaucoup plus propre, dans ce cas. Aussi, si vous décidez plus tard que vous souhaitez spécifier une autre propriété (par exemple, largeur de raie) que vous n'avez pas à l'origine explicitement code, il permet tout d'être transmis àplot
. Je tiens à ajouter la possibilité de spécifier explicitement un des axes de l'objet à tracer sur quand j'écris des fonctions similaires, de sorte que j'ai l'habitude de faire quelque chose le long des lignes deax = kwargs.pop('ax', plt.gca())
.ax._get_lines.color_cycle
n'existe plus dans la version 1.5?cycler
de la bibliothèque. Il permet beaucoup plus de souplesse style de vélo. Désinvolte, je ne me souviens pas de ce que l'équivalent est, et je suis en voyage sans un ordinateur portable. Si vous le trouvez, n'hésitez pas à modifier la question. Je vais essayer de mettre à jour plus tard, si je n'oublie pas.ax._get_lines.prop_cycler
vous pouvez construire quelque chose commeif 'color' in ax._get_lines._prop_keys:
suivie parnext(ax._get_lines.prop_cycler)['color']
à faire l'équivalent de ce qui est proposé aveccolor_cycle
dans la réponse, je crois. Je ne suis pas sûr de savoir si vous pouvez obtenir un objet iterable seulement les couleurs, j'avais besoin d'explorer plus.next()
sur l'itérateurax._get_lines.color_cycle
-->next_color = next(ax._get_lines.color_cycle)
.Voici une manière qui fonctionne dans la version 1.5 qui va, espérons-le futur-preuve qu'il ne repose pas sur des méthodes précédées par des caractères de soulignement:
Cela vous donnera une liste des couleurs définies dans l'ordre pour le style actuel.
Remarque: Dans les versions les plus récentes de matplotlib (>= 1.5)
_get_lines
a changé. Vous devez maintenant utilisernext(ax._get_lines.prop_cycler)['color']
en Python 2 ou 3 (ouax._get_lines.prop_cycler.next()['color']
dans Python 2) pour obtenir la prochaine couleur dans le cycle.Dans la mesure du possible d'utiliser l'approche la plus directe affiché dans la partie inférieure de @joe-kingston portant la réponse. Comme
_get_lines
n'est pas API-face, il pourrait à nouveau changer en un pas vers l'arrière compatible manière dans le futur.Sûr, cela va faire il.
Donne:
Ici est la itertools fonction que matplotlib utilise itertools.cycle
Edit: Merci pour le commentaire, il semble qu'il n'est pas possible de copier un itérateur. Une idée serait de faire un dump d'un cycle complet, et de garder trace de la valeur que vous utilisez, permettez-moi de revenir sur ce que.
Edit2: Bon, cela vous donnera de la couleur suivante et faire un nouvel itérateur qui se comporte comme si le prochain n'a pas été appelé. Ce n'est pas de conserver l'ordre de la coloration, la juste valeur de couleur, je vous laisse faire.
Cela donne le résultat suivant, notez que la pente du tracé correspond à l'index, par exemple, d'abord g est le bottomest graphique et ainsi de suite.
Console
Je tiens juste à ajouter sur ce @Andi dit ci-dessus. Depuis
color_cycle
est obsolète dans matplotlib 1.5, vous devez utiliserprop_cycler
, cependant, l'Andi solution (ax._get_lines.prop_cycler.next()['color']
) retourné cette erreur pour moi:Le code qui a fonctionné pour moi a été:
next(ax._get_lines.prop_cycler)
, qui en réalité n'est pas loin de @joe-kingston portant l'original de la réponse.Personnellement, je n'ai rencontré ce problème lors d'un twinx (axe), qui reset la couleur du cycleur. J'avais besoin d'un moyen de rendre les couleurs de cycle correctement parce que j'ai été en utilisant
style.use('ggplot')
. Il pourrait y avoir un moyen plus facile/mieux à faire, alors n'hésitez pas à me corriger.next(ax._get_lines.prop_cycler)
est une alternative possible.next(ax._get_lines.prop_cycler)
fait des changements de l'état de la couleur du cycleur?prop_cycler
. Si vous lisez la accepté de répondre à cette question, vous verrez qu'il n'y a aucun moyen d'accéder à l'état deprop_cycler
sans changer son état parce que c'est un objet iterable.Depuis matplotlib utilise
itertools.cycle
nous pouvons regarder à travers l'ensemble de la couleur de cycle, puis restaurer l'itérateur à son état précédent:Il doit retourner la liste sans modification de l'état de l'itérateur.
L'utiliser avec matplotlib >= 1.5:
ou avec matplotlib < 1.5:
Dans matplotlib version 2.2.3 il y a un
get_next_color()
méthode sur la_get_lines
propriété:get_next_color()
renvoie une couleur html chaîne, et les progrès de la couleur cycle d'itérateur.