Matplotlib fait cela par défaut.
Par exemple:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.show()
Et, comme vous le savez peut-être déjà, vous pouvez facilement ajouter une légende:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')
plt.show()
Si vous souhaitez contrôler les couleurs à parcourir:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
plt.gca().set_color_cycle(['red', 'green', 'blue', 'yellow'])
plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')
plt.show()
Si vous n'êtes pas familier avec matplotlib, le tutoriel est un bon point de départ .
Éditer:
Tout d'abord, si vous avez beaucoup (> 5) de choses que vous souhaitez tracer sur une figure, soit:
- Mettez-les sur différentes parcelles (pensez à utiliser quelques sous-parcelles sur une figure), ou
- Utilisez autre chose que la couleur (c.-à-d. Les styles de marqueur ou l'épaisseur de ligne) pour les distinguer.
Sinon, vous allez vous retrouver avec un complot très salissant! Soyez gentil avec qui jamais lira ce que vous faites et n'essayez pas de mettre 15 choses différentes sur une seule figure !!
Au-delà de cela, de nombreuses personnes sont daltoniennes à des degrés divers, et la distinction entre de nombreuses couleurs subtilement différentes est difficile pour plus de gens que vous ne le pensez.
Cela dit, si vous voulez vraiment mettre 20 lignes sur un axe avec 20 couleurs relativement distinctes, voici une façon de le faire:
import matplotlib.pyplot as plt
import numpy as np
num_plots = 20
# Have a look at the colormaps here and decide which one you'd like:
# http://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html
colormap = plt.cm.gist_ncar
plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))
# Plot several different functions...
x = np.arange(10)
labels = []
for i in range(1, num_plots + 1):
plt.plot(x, i * x + 5 * i)
labels.append(r'$y = %ix + %i$' % (i, 5*i))
# I'm basically just demonstrating several different legend options here...
plt.legend(labels, ncol=4, loc='upper center',
bbox_to_anchor=[0.5, 1.1],
columnspacing=1.0, labelspacing=0.0,
handletextpad=0.0, handlelength=1.5,
fancybox=True, shadow=True)
plt.show()
set_color_cycle
a été déconseillé, de sorte que cette ligne devrait êtreplt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))
et juste changer leplt.cm.YOUR_PREFERED_COLOR_MAP
pour l'adapter à vos besoins.axes
) et a demandé comment faire varier la couleur d'une seule ligne dans différentes parcelles (différentesaxes
) ... Cela dit, excellente réponse à une importante question (peut-être différente de ce que OP a demandé, mais personne ne peut le dire car ils ont posé cette seule question et ont disparu!) - +1Les définir plus tard
Si vous ne connaissez pas le nombre de tracés que vous allez tracer, vous pouvez changer les couleurs une fois que vous les avez tracées en récupérant le nombre directement à partir du tracé en utilisant
.lines
, j'utilise cette solution:Quelques données aléatoires
Le morceau de code dont vous avez besoin:
Le résultat est le suivant:
la source
TL; DR Non, cela ne peut pas être fait automatiquement . Oui c'est possible.
Chaque tracé (
axes
) dans une figure (figure
) a son propre cycle de couleurs - si vous ne forcez pas une couleur différente pour chaque tracé, tous les tracés partagent le même ordre de couleurs mais, si nous étirons un peu ce que signifie "automatiquement" , ça peut être fait.L'OP a écrit
Mais ... Matplotlib génère automatiquement des couleurs différentes pour chaque courbe différente
Alors pourquoi la demande OP? Si nous continuons à lire, nous avons
et cela a du sens, car chaque intrigue (chacune
axes
dans le langage de Matplotlib) a sa proprecolor_cycle
(ou plutôt, en 2018, sonprop_cycle
) et chaque intrigue (axes
) réutilise les mêmes couleurs dans le même ordre.Si tel est le sens de la question d'origine, une possibilité consiste à nommer explicitement une couleur différente pour chaque tracé.
Si les tracés (comme cela arrive souvent) sont générés dans une boucle, nous devons avoir une variable de boucle supplémentaire pour remplacer la couleur choisie automatiquement par Matplotlib.
Une autre possibilité consiste à instancier un objet cycler
Notez que
type(my_cycler)
c'estcycler.Cycler
maistype(actual_cycler)
estitertools.cycle
.la source
Je voudrais offrir une amélioration mineure par rapport à la dernière réponse de boucle donnée dans le post précédent (ce post est correct et devrait encore être accepté). L'hypothèse implicite faite lors de l'étiquetage du dernier exemple est que le
plt.label(LIST)
numéro d'étiquette XLIST
avec la ligne correspondant à la Xème fois aplot
été appelé. J'ai déjà rencontré des problèmes avec cette approche. La façon recommandée de créer des légendes et de personnaliser leurs étiquettes selon la documentation de matplotlibs ( http://matplotlib.org/users/legend_guide.html#adjusting-the-order-of-legend-item ) est d'avoir un sentiment chaleureux que les étiquettes vont ainsi que les tracés exacts que vous pensez qu'ils font:**: Matplotlib Legends ne fonctionne pas
la source