2017-10-12 5 views
1

Je souhaite utiliser la couleur suivante pour chaque tracé tracé par for. Mais quand j'appelle ax1._get_lines.prop_cycler.next(), il ne peut pas aller à la troisième couleur. Comment faire quelque chose comme .next().next() ou ax1._get_lines.prop_cycler.next()[k] dans la ligne de la boucle en utilisant k in xrange()?Passez à la couleur suivante de ax._get_lines.prop_cycler.next() en continu par la boucle

a = np.cumsum(np.cumsum(np.random.randn(7,4), axis=0), axis=1) 

lab = np.array(["A","B","C","E"]) 

for k in xrange(4): 
    ax1 = plt.subplot2grid((4, 1), (k, 0), rowspan=1, colspan=4) 
    ax1._get_lines.prop_cycler.next() 
    ax1.plot(a[:,k]) 
    plt.legend(labels=lab[k:k+1]) 

plt.show() 

enter image description here

Répondre

0

Dans le code de la question, chaque sous-parcelle a son propre cycle de couleur, de sorte que next vous donne la deuxième couleur du cycle de couleur des axes dans chaque sous-parcelle.

Une solution serait de partager le même cycle de couleur entre tous les sous-plans.

Pour le cas où vous créez les intrigues secondaires à l'intérieur de la boucle, vous pouvez utiliser

import matplotlib.pyplot as plt 
import numpy as np 

a = np.cumsum(np.cumsum(np.random.randn(7,4), axis=0), axis=1) 

lab = np.array(["A","B","C","E"]) 

for k in xrange(4): 
    ax1 = plt.subplot2grid((4, 1), (k, 0)) 
    if k==0: 
     c = ax1._get_lines.prop_cycler 
    else: 
     ax1._get_lines.prop_cycler = c 
    ax1.plot(a[:,k]) 
    plt.legend(labels=lab[k:k+1]) 

plt.show() 

Ou dans un cas où des intrigues secondaires sont créés à la fois,

import matplotlib.pyplot as plt 
import numpy as np 

a = np.cumsum(np.cumsum(np.random.randn(7,4), axis=0), axis=1) 

lab = np.array(["A","B","C","E"]) 

fig, axes = plt.subplots(4,1) 
for k, ax in enumerate(axes): 
    ax._get_lines.prop_cycler = axes[0]._get_lines.prop_cycler 
    ax.plot(a[:,k]) 
    ax.legend(labels=lab[k]) 

plt.show() 

Bien sûr, vous pouvez aussi utiliser le cycleur de couleur de chaque axe individuellement et le propager à la prochaine couleur

import matplotlib.pyplot as plt 
import numpy as np 

a = np.cumsum(np.cumsum(np.random.randn(7,4), axis=0), axis=1) 

lab = np.array(["A","B","C","E"]) 

fig, axes = plt.subplots(4,1) 
for k, ax in enumerate(axes): 
    for i in range(k): 
     next(ax._get_lines.prop_cycler) 
    ax.plot(a[:,k]) 
    ax.legend(labels=lab[k]) 

plt.show() 

Dans tous les cas le résultat ressemblerait à ceci:

enter image description here

0

Le problème avec votre code est que vous créez une nouvelle instance d'axes dans chaque boucle, puis vous faites ax1._get_lines.prop_cycler.next(). Puisque ax1 est un nouvel objet à chaque fois, vous obtenez toujours la même couleur.

La meilleure solution consiste à passer explicitement la couleur à l'intrigue. Vous devriez être en mesure d'obtenir ce que vous voulez avec le code suivant, inspiré par this example:

import numpy as np 
import matplotlib.pyplot as plt 

a = np.cumsum(np.cumsum(np.random.randn(7,4), axis=0), axis=1) 
lab = np.array(["A","B","C","E"]) 

colors = plt.rcParams['axes.prop_cycle'] 
colors = colors.by_key()['color'] 

for (k, label), color in zip(enumerate(lab), colors): 
    ax1 = plt.subplot2grid((4, 1), (k, 0), rowspan=1, colspan=4) 
    ax1.plot(a[:,k], color=color) 
    plt.legend(labels=label) 

plt.show() 

Remarque: ma version du code évite également xrange et la méthode next() qui ne parviennent pas à python3. Un avertissement: dans votre exemple, vous utilisez ax1._get_lines. Habituellement, les noms commençant par un trait de soulignement sont considérés comme privés: par conséquent, les développeurs de matplotlib peuvent modifier ou supprimer l'attribut _get_lines à tout moment sans préavis et enfreindre votre code. Je vous suggère de faire usage de l'API publique autant que possible.

+0

Je pense que vous vouliez créer un lien vers quelque chose avec « cet exemple »? En ce qui concerne 'next' j'ai mis à jour [ma réponse précédente] (https://stackoverflow.com/a/46672037/4124317) pour inclure des options pour python 2 ou 3 (' next (ax._get_lines.prop_cycler) '). – ImportanceOfBeingErnest

+0

Merci d'avoir repéré le chaînon manquant –