2011-01-26 11 views

Respuesta

263

Matplotlib lo hace de forma predeterminada.

Ej:

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

Basic plot demonstrating color cycling

Y, como usted ya sabe, usted puede agregar fácilmente una leyenda:

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

Basic plot with legend

Si desea controlar los colores que se reciclarán:

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

Plot showing control over default color cycling

Espero que ayude un poco! Si no está familiarizado con matplotlib, the tutorial is a good place to start.

Editar:

En primer lugar, si usted tiene una gran cantidad (> 5) de las cosas que desea trazar en una figura, ya sea:

  1. los ponen en diferentes parcelas (considerar el uso algunas subtramas en una figura), o
  2. Use algo diferente al color (es decir, estilos de marcador o grosor de línea) para distinguirlos.

De lo contrario, va a terminar con un muy complot desordenado! Sé amable con quien alguna vez va a leer lo que sea que estés haciendo y no intentes meter 15 cosas diferentes en una figura.

Más allá de eso, muchas personas son daltónicas en diversos grados, y distinguir entre numerosos colores sutilmente diferentes es difícil para más personas de lo que se puede imaginar.

Que habiendo sido dicho, si realmente quiere poner 20 líneas en un eje con 20 colores relativamente distintos, aquí hay una manera de hacerlo:

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_color_cycle([colormap(i) for i in np.linspace(0, 0.9, 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() 

Unique colors for 20 lines based on a given colormap

+2

Nota para el último ejemplo, en las versiones más recientes de matplotlib, el 'set_color_cycle' ha quedado obsoleto, por lo que esa línea debe ser' plt.gca(). set_prop_cycle (plt.cycler ('color', plt.cm.jet (np.linspace (0, 1, num_plots)))) ' y simplemente cambie 'plt.cm.YOUR_PREFERED_COLOR_MAP' para satisfacer sus necesidades. – Nate

+0

@JoeKington: La explicación fue maravillosa, muchas gracias – Breeze

2

me gustaría ofrecer una mejora menor en la respuesta del último ciclo dada en la publicación anterior (esa publicación es correcta y aún debe ser aceptada). La suposición implícita al etiquetar el último ejemplo es que plt.label(LIST) pone la etiqueta número X en LIST con la línea correspondiente a la X vez que se llamó a plot. He tenido problemas con este enfoque antes.La forma recomendada para construir leyendas y personalizar sus etiquetas por documentación matplotlibs (http://matplotlib.org/users/legend_guide.html#adjusting-the-order-of-legend-item) es tener una sensación de calor que las etiquetas van junto con las parcelas exactas usted piensa que hacen:

... 
# Plot several different functions... 
labels = [] 
plotHandles = [] 
for i in range(1, num_plots + 1): 
    x, = plt.plot(some x vector, some y vector) #need the ',' per ** below 
    plotHandles.append(x) 
    labels.append(some label) 
plt.legend(plotHandles, labels, 'upper left',ncol=1) 

**: Matplotlib Legends not working

+3

Solo fyi: también puedes usar la etiqueta "kwarg" para trazar y luego llamar a la leyenda sin ningún argumento. –

14

Configuración de ellos más tarde

Si no conoce el número de las parcelas que se van a trazar puede cambiar los colores una vez que haya trazado recuperar el número directamente desde la trama usando .lines, utilizo esta solución:

Algunos datos aleatorios

import matplotlib.pyplot as plt 
import numpy as np 

fig1 = plt.figure() 
ax1 = fig1.add_subplot(111) 


for i in range(1,15): 
    ax1.plot(np.array([1,5])*i,label=i) 

El trozo de código que necesita:

colormap = plt.cm.gist_ncar #nipy_spectral, Set1,Paired 
colors = [colormap(i) for i in np.linspace(0, 1,len(ax1.lines))] 
for i,j in enumerate(ax1.lines): 
    j.set_color(colors[i]) 


ax1.legend(loc=2) 

El resultado es el siguiente: enter image description here

Cuestiones relacionadas