Comment choisir une nouvelle couleur pour chaque ligne tracée dans une figure dans matplotlib?

109

Je ne voudrais PAS spécifier de couleur pour chaque ligne tracée et que chaque ligne obtienne une couleur distincte. Mais si je cours:

from matplotlib import pyplot as plt
for i in range(20):
    plt.plot([0, 1], [i, i])

plt.show()

alors j'obtiens cette sortie:

Image du graphique généré par le code ci-dessus

Si vous regardez l'image ci-dessus, vous pouvez voir que matplotlib tente de choisir des couleurs différentes pour chaque ligne, mais finalement il réutilise les couleurs - les dix lignes du haut utilisent les mêmes couleurs que les dix du bas. Je veux juste l'empêcher de répéter des couleurs déjà utilisées ET / OU lui donner une liste de couleurs à utiliser.

dlamotte
la source

Réponses:

59

matplotlib 1.5+

Vous pouvez utiliser axes.set_prop_cycle( exemple ).

matplotlib 1.0-1.4

Vous pouvez utiliser axes.set_color_cycle( exemple ).

matplotlib 0.x

Vous pouvez utiliser Axes.set_default_color_cycle.

tom10
la source
1
Plus dans le sens de ce que je cherchais ... Avez-vous une chance d'ajouter des informations sur la façon d'utiliser une palette de couleurs pour générer une liste de N couleurs?
dlamotte le
19
@xyld - Ne pas trop brancher ma propre réponse, mais il y a un exemple au bas de cette réponse: stackoverflow.com/questions/4805048/... En gros, vous faites simplement ceci :, [colormap(i) for i in np.linspace(0, 0.9, num_plots)]colormapest l'une des couleurs matplotlib.pyplot.cmet numplotsest le numéro de couleurs uniques que vous voulez. Attention, cela peut entraîner des couleurs difficiles à distinguer les unes des autres !!
Joe Kington
4
Bonne réponse Joe, et cela semble répondre à la question de xyld, donc je vais simplement en rester là. Cependant, il convient également de noter qu'il existe de bonnes réponses à la question sur la génération de couleurs distinctes, telles que stackoverflow.com/questions/470690/…
tom10
Cela fonctionne-t-il pour n'importe quelle parcelle? J'ai essayé set_prop_cycle sur Axes3D, puis j'ai utilisé la boucle for pour plusieurs parcelles avec ax.plot_wireframe (), mais 2 parcelles sont colorées de la même couleur.
Joonho Park le
112

J'utilise généralement le deuxième de ceux-ci:

from matplotlib.pyplot import cm
import numpy as np

#variable n below should be number of curves to plot

#version 1:

color=cm.rainbow(np.linspace(0,1,n))
for i,c in zip(range(n),color):
   plt.plot(x, y,c=c)

#or version 2:

color=iter(cm.rainbow(np.linspace(0,1,n)))
for i in range(n):
   c=next(color)
   plt.plot(x, y,c=c)

Exemple de 2: exemple de tracé avec iter, couleur suivante

Mark Amery
la source
J'ai utilisé # 2. J'ai une liste de chaînes que je dois tracer, mais elles peuvent être de différentes longueurs. J'ai trouvé que le réglage n = len de cette liste était très utile pour s'assurer que les couleurs choisies couvrent la gamme et que vous pouvez faire la différence. Si ce nombre est trop élevé, il est difficile de voir la différence entre les couleurs.
mauve du
J'ai utilisé # 1, il était utile de l'utiliser avec enumerate (list_name)
DevX
11

prop_cycle

color_cyclea été déconseillée dans la 1.5 au profit de cette généralisation: http://matplotlib.org/users/whats_new.html#added-axes-prop-cycle-key-to-rcparams

# cycler is a separate package extracted from matplotlib.
from cycler import cycler
import matplotlib.pyplot as plt

plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b'])))
plt.plot([1, 2])
plt.plot([2, 3])
plt.plot([3, 4])
plt.plot([4, 5])
plt.plot([5, 6])
plt.show()

Également illustré dans l'exemple (maintenant mal nommé): http://matplotlib.org/1.5.1/examples/color/color_cycle_demo.html mentionné à: https://stackoverflow.com/a/4971431/895245

Testé dans matplotlib 1.5.1.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
9

Je ne sais pas si vous pouvez changer automatiquement la couleur, mais vous pourriez exploiter votre boucle pour générer différentes couleurs:

for i in range(20):
   ax1.plot(x, y, color = (0, i / 20.0, 0, 1)

Dans ce cas, les couleurs varieront du noir au vert à 100%, mais vous pouvez l'ajuster si vous le souhaitez.

Consultez la documentation de matplotlib plot () et recherchez l' colorargument mot - clé.

Si vous souhaitez alimenter une liste de couleurs, assurez-vous simplement que vous avez une liste assez grande puis utilisez l'index de la boucle pour sélectionner la couleur

colors = ['r', 'b', ...., 'w']

for i in range(20):
   ax1.plot(x, y, color = colors[i])
Andrea Spadaccini
la source
1
Ouais, je voulais en quelque sorte éviter de faire quelque chose comme ça. J'ai regardé dans les cartes de couleurs, mais je ne sais pas comment les utiliser.
dlamotte le
Cette solution ne permet pas de contrôler facilement une palette de couleurs
Ryszard Cetnarski
C'est très bien, en particulier lorsque set_prop_cycle échoue. Je ne sais pas pourquoi set_prop_cycle ou la coloration automatique échoue dans plot_wireframe () dans Axes3D. Mais c'est une sorte de solution basique / manuelle pour la coloration.
Joonho Park le
6

Vous pouvez utiliser une "palette de couleurs qualitative" prédéfinie comme ceci:

from matplotlib.cm import get_cmap

name = "Accent"
cmap = get_cmap(name)  # type: matplotlib.colors.ListedColormap
colors = cmap.colors  # type: list
axes.set_prop_cycle(color=colors)

Testé sur matplotlib 3.0.3. Voir https://github.com/matplotlib/matplotlib/issues/10840 pour savoir pourquoi vous ne pouvez pas appeler axes.set_prop_cycle(color=cmap).

Une liste de couleurs prédéfinies qualitatives est disponible sur https://matplotlib.org/gallery/color/colormap_reference.html :

Liste des couleurs qualitatives

nyanpasu64
la source
Notez qu'il prend les 3 premières couleurs dans l'ordre sur ceux
Ben Jones
2

Vous pouvez également modifier le cycle de couleurs par défaut dans votre matplotlibrcfichier. Si vous ne savez pas où se trouve ce fichier, procédez comme suit en python:

import matplotlib
matplotlib.matplotlib_fname()

Cela vous montrera le chemin vers votre fichier matplotlibrc actuellement utilisé. Dans ce fichier, vous trouverez parmi de nombreux autres paramètres également celui pour axes.color.cycle. Mettez simplement votre séquence de couleurs désirée et vous la trouverez dans chaque tracé que vous créez. Notez que vous pouvez également utiliser tous les noms de couleurs html valides dans matplotlib.

Thomasillo
la source
0

Comme les notes de réponse de Ciro , vous pouvez utiliser prop_cyclepour définir une liste de couleurs que matplotlib doit parcourir. Mais combien de couleurs? Que faire si vous souhaitez utiliser le même cycle de couleurs pour de nombreux tracés, avec des nombres de lignes différents?

Une tactique serait d'utiliser une formule comme celle de https://gamedev.stackexchange.com/a/46469/22397 , pour générer une séquence infinie de couleurs où chaque couleur essaie d'être significativement différente de toutes celles qui l'ont précédée.

Malheureusement, prop_cyclen'acceptera pas les séquences infinies - il se bloquera pour toujours si vous en passez une. Mais nous pouvons prendre, par exemple, les 1000 premières couleurs générées à partir d'une telle séquence et les définir comme cycle de couleurs. De cette façon, pour les tracés avec un nombre raisonnable de lignes, vous devriez obtenir des couleurs distinctes.

Exemple:

from matplotlib import pyplot as plt
from matplotlib.colors import hsv_to_rgb
from cycler import cycler

# 1000 distinct colors:
colors = [hsv_to_rgb([(i * 0.618033988749895) % 1.0, 1, 1])
          for i in range(1000)]
plt.rc('axes', prop_cycle=(cycler('color', colors)))

for i in range(20):
    plt.plot([1, 0], [i, i])

plt.show()

Production:

Graphique généré par le code ci-dessus

Maintenant, toutes les couleurs sont différentes - même si j'avoue que j'ai du mal à en distinguer quelques-unes!

Mark Amery
la source