Matplotlib hace esto por defecto.
P.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()
Y, como ya sabrá, 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()
Si desea controlar los colores que se recorrerán a través de:
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 no está familiarizado con matplotlib, el tutorial es un buen lugar para comenzar .
Editar:
En primer lugar, si tiene muchas (> 5) cosas que desea trazar en una figura, ya sea:
- Póngalos en diferentes parcelas (considere usar algunas subtramas en una figura), o
- Use algo que no sea color (es decir, estilos de marcador o grosor de línea) para distinguir entre ellos.
De lo contrario, terminarás con un muy trama desordenada! ¡Sé amable con quien va a leer lo que sea que estés haciendo y no intentes meter 15 cosas diferentes en una sola 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 puede imaginar.
Dicho esto, si realmente quieres poner 20 líneas en un eje con 20 colores relativamente distintos, aquí hay una forma 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_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
ha quedado en desuso, por lo que esa línea debería serplt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))
y solo cambiarlaplt.cm.YOUR_PREFERED_COLOR_MAP
para satisfacer sus necesidades.axes
) y me preguntó sobre la variación del color de una sola línea en diferentes parcelas (diferentesaxes
) ... Dicho esto, excelente respuesta a una importante pregunta (posiblemente diferente de lo que OP preguntó, ¡pero nadie puede decirlo porque hicieron esta sola pregunta y desaparecieron!) - +1Poniéndolos luego
Si no sabe el número de parcelas que va a trazar, puede cambiar los colores una vez que los haya trazado recuperando el número directamente de la trama usando
.lines
, utilizo esta solución:Algunos datos al azar
El código que necesitas:
El resultado es el siguiente:
fuente
TL; DR No, no se puede hacer automáticamente . Sí, es posible.
Cada gráfico (
axes
) en una figura (figure
) tiene su propio ciclo de colores: si no fuerza un color diferente para cada gráfico, todos los gráficos comparten el mismo orden de colores pero, si estiramos un poco, qué significa "automáticamente" , se puede hacer.El OP escribió
Pero ... Matplotlib genera automáticamente diferentes colores para cada curva diferente
Entonces, ¿por qué la solicitud de OP? Si continuamos leyendo, tenemos
y tiene sentido, porque cada trama (cada
axes
en el lenguaje de Matplotlib) tiene su propiacolor_cycle
(o más bien, en 2018, suprop_cycle
) y cada trama (axes
) reutiliza los mismos colores en el mismo orden.Si este es el significado de la pregunta original, una posibilidad es nombrar explícitamente un color diferente para cada parcela.
Si las parcelas (como sucede a menudo) se generan en un bucle, debemos tener una variable de bucle adicional para anular el color elegido automáticamente por Matplotlib.
Otra posibilidad es instanciar un objeto ciclador
Tenga en cuenta que
type(my_cycler)
escycler.Cycler
perotype(actual_cycler)
esitertools.cycle
.fuente
Me gustaría ofrecer una mejora menor en la última respuesta de bucle dada en la publicación anterior (esa publicación es correcta y aún debe ser aceptada). La suposición implícita hecha al etiquetar el último ejemplo es que
plt.label(LIST)
coloca el número de etiqueta X enLIST
la línea correspondiente a la Xa vez queplot
se llamó. Me he encontrado con problemas con este enfoque antes. La forma recomendada de construir leyendas y personalizar sus etiquetas según la documentación de matplotlibs ( http://matplotlib.org/users/legend_guide.html#adjusting-the-order-of-legend-item ) es tener una sensación cálida de que las etiquetas se van junto con las tramas exactas que crees que hacen:**: Matplotlib Legends no funciona
fuente