Come scegliere un nuovo colore per ogni linea tracciata all'interno di una figura in matplotlib?


109

Vorrei NON specificare un colore per ogni linea tracciata e fare in modo che ogni linea ottenga un colore distinto. Ma se corro:

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

plt.show()

quindi ottengo questo output:

Immagine dell'output del grafico dal codice sopra

Se guardi l'immagine sopra, puoi vedere che matplotlib tenta di scegliere colori per ogni riga che sono diversi, ma alla fine riutilizza i colori: le prime dieci linee usano gli stessi colori delle ultime dieci. Voglio solo impedire che ripeta i colori già utilizzati E / O fornirgli un elenco di colori da utilizzare.

Risposte:


59

matplotlib 1.5+

Puoi usare axes.set_prop_cycle( esempio ).

matplotlib 1.0-1.4

Puoi usare axes.set_color_cycle( esempio ).

matplotlib 0.x

Puoi usare Axes.set_default_color_cycle.


1
Più sulla falsariga di quello che stavo cercando ... C'è la possibilità che tu possa aggiungere informazioni su come utilizzare una mappa di colori per generare un elenco di N colori?
dlamotte

19
@xyld - Non per inserire troppo la mia risposta, ma c'è un esempio in fondo a questa risposta: stackoverflow.com/questions/4805048/… Fondamentalmente fai solo questo :, [colormap(i) for i in np.linspace(0, 0.9, num_plots)]dove colormapè una delle mappe di colore in matplotlib.pyplot.cmed numplotsè il numero di colori unici che desideri. Attenzione però che questo può dare come risultato colori difficili da distinguere l'uno dall'altro !!
Joe Kington

4
Bella risposta Joe, e sembra rispondere alla domanda di xyld, quindi lo lascio a questo. Inoltre, anche se, vale la pena notare che ci sono alcune buone risposte alla domanda sulla generazione di colori distinti, come stackoverflow.com/questions/470690/...
tom10

Funziona per qualsiasi trama? Ho provato set_prop_cycle su Axes3D, quindi ho usato per loop per più grafici con ax.plot_wireframe (), ma 2 grafici sono colorati con lo stesso colore.
Joonho Park,

112

Di solito uso il secondo di questi:

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)

Esempio di 2: esempio di trama con iter, colore successivo


Ho usato il n. 2. Ho un elenco di canali che devo tracciare, ma possono essere di varie lunghezze. Ho scoperto che l'impostazione n = len di quella lista è stata molto utile per assicurarmi che i colori scelti coprano la gamma e tu possa capire la differenza. Se quel numero è troppo alto, è difficile vedere la differenza nei colori.
malva

Ho usato # 1, è stato utile usare con enumerate (
list_name

11

prop_cycle

color_cycleè stato deprecato nella 1.5 in favore di questa generalizzazione: 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()

Mostrato anche nell'esempio (ora mal chiamato): http://matplotlib.org/1.5.1/examples/color/color_cycle_demo.html menzionato su: https://stackoverflow.com/a/4971431/895245

Testato in matplotlib 1.5.1.


9

Non so se puoi cambiare automaticamente il colore, ma potresti sfruttare il tuo ciclo per generare colori diversi:

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

In questo caso, i colori varieranno dal nero al 100% verde, ma puoi regolarlo se lo desideri.

Vedere la documentazione di matplotlib plot () e cercare l' colorargomento della parola chiave.

Se vuoi alimentare una lista di colori, assicurati di avere una lista abbastanza grande e poi usa l'indice del loop per selezionare il colore

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

for i in range(20):
   ax1.plot(x, y, color = colors[i])

1
Sì, volevo evitare di fare qualcosa del genere. Ho esaminato le mappe dei colori, ma sono abbastanza confuso su come usarle.
dlamotte

Questa soluzione non offre un modo semplice per controllare una mappa di colori
Ryszard Cetnarski

Questo è molto buono, specialmente quando set_prop_cycle fallisce. Non so perché set_prop_cycle o la colorazione automatica falliscono in plot_wireframe () in Axes3D. Ma questa è una sorta di soluzione di base / manuale per la colorazione.
Joonho Park,

6

È possibile utilizzare una "mappa di colori qualitativa" predefinita come questa:

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)

Testato su matplotlib 3.0.3. Vedi https://github.com/matplotlib/matplotlib/issues/10840 per la discussione sul motivo per cui non puoi chiamare axes.set_prop_cycle(color=cmap).

Un elenco di mappe di colori qualitative predefinite è disponibile su https://matplotlib.org/gallery/color/colormap_reference.html :

Elenco delle mappe di colori qualitative


Nota che su questi sono necessari i primi 3 colori in sequenza
Ben Jones

2

È inoltre possibile modificare il ciclo di colori predefinito nel matplotlibrcfile. Se non sai dove si trova quel file, fai quanto segue in python:

import matplotlib
matplotlib.matplotlib_fname()

Questo ti mostrerà il percorso del tuo file matplotlibrc attualmente utilizzato. In quel file troverai tra molte altre impostazioni anche quella per axes.color.cycle. Basta inserire la sequenza di colori desiderata e la troverai in ogni trama che realizzi. Nota che puoi anche usare tutti i nomi di colori html validi in matplotlib.


0

Come nota la risposta di Ciro , puoi usare prop_cycleper impostare un elenco di colori che matplotlib deve scorrere. Ma quanti colori? Cosa succede se si desidera utilizzare lo stesso ciclo di colori per molti grafici, con un numero di linee diverso?

Una tattica sarebbe quella di utilizzare una formula come quella da https://gamedev.stackexchange.com/a/46469/22397 , per generare una sequenza infinita di colori in cui ogni colore cerca di essere significativamente diverso da tutti quelli che lo hanno preceduto.

Sfortunatamente, prop_cyclenon accetterà sequenze infinite: si bloccherà per sempre se ne passi una. Ma possiamo prendere, diciamo, i primi 1000 colori generati da una tale sequenza e impostarli come ciclo di colori. In questo modo, per i grafici con un numero qualsiasi di linee, dovresti ottenere colori distinguibili.

Esempio:

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()

Produzione:

Output grafico dal codice sopra

Ora, tutti i colori sono diversi, anche se ammetto che faccio fatica a distinguerne alcuni!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.