Cómo elegir un nuevo color para cada línea trazada dentro de una figura

6 minutos de lectura

avatar de usuario de dlamotte
dlamotte

Me gustaría NO especificar un color para cada línea trazada y hacer que cada línea tenga un color distinto. Pero si ejecuto:

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

plt.show()

entonces obtengo esta salida:

Imagen de la salida del gráfico por el código de arriba

Si observa la imagen de arriba, puede ver que matplotlib intenta elegir colores para cada línea que son diferentes, pero eventualmente reutiliza los colores: las diez líneas superiores usan los mismos colores que las diez inferiores. Solo quiero evitar que repita colores ya usados ​​Y/O darle una lista de colores para usar.

Usualmente uso el segundo de estos:

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)

Ejemplo de 2:
gráfico de ejemplo con iter,siguiente color

  • Usé el #2. Tengo una lista de canales que necesito trazar, pero pueden tener diferentes longitudes. Descubrí que configurar n = len de esa lista fue muy útil para asegurar que los colores elegidos abarquen el rango y se pueda notar la diferencia. Si ese número es demasiado alto, es difícil ver la diferencia en los colores.

    – malva

    17 de julio de 2015 a las 14:23

  • Usé el n. ° 1, fue útil usarlo con enumerate (list_name)

    – DevX

    20 de julio de 2020 a las 9:07

avatar de usuario de tom10
tom10

matplotlib 1.5+

Puedes usar axes.set_prop_cycle (ejemplo).

matplotlib 1.0-1.4

Puedes usar axes.set_color_cycle (ejemplo).

matplotlib 0.x

Puedes usar Axes.set_default_color_cycle.

  • Más en la línea de lo que estaba buscando … ¿Alguna posibilidad de que pueda agregar información sobre cómo usar un mapa de colores para generar una lista de N colores?

    – dlamotte

    11 de febrero de 2011 a las 16:27

  • @xyld: para no conectar demasiado mi propia respuesta, pero hay un ejemplo al final de esta respuesta: stackoverflow.com/questions/4805048/… Básicamente, solo haces esto: [colormap(i) for i in np.linspace(0, 0.9, num_plots)]dónde colormap es uno de los mapas de color en matplotlib.pyplot.cm y numplots es el número de colores únicos que desea. ¡Sin embargo, tenga en cuenta que esto puede dar como resultado colores que son difíciles de distinguir entre sí!

    –Joe Kington

    11 de febrero de 2011 a las 16:44


  • Buena respuesta Joe, y parece responder a la pregunta de xyld, así que lo dejaré así. Sin embargo, también vale la pena señalar que hay algunas buenas respuestas a las preguntas sobre la generación de colores distintos, como stackoverflow.com/questions/470690/…

    – tom10

    11 de febrero de 2011 a las 16:50


  • Sirve para cualquier parcela? Probé set_prop_cycle en Axes3D, luego usé for loop para múltiples gráficos con ax.plot_wireframe(), pero 2 gráficos están coloreados con el mismo color.

    – Parque Joonho

    4 de junio de 2020 a las 8:29

avatar de usuario de nyanpasu64
nyanpasu64

Puede usar un “mapa de colores cualitativo” predefinido como este:

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)

Probado en matplotlib 3.0.3. Ver https://github.com/matplotlib/matplotlib/issues/10840 para discutir por qué no puede llamar axes.set_prop_cycle(color=cmap).

Una lista de mapas de colores cualitativos predefinidos está disponible en https://matplotlib.org/gallery/color/colormap_reference.html :

Lista de mapas de colores cualitativos

  • Tenga en cuenta que toma los primeros 3 colores en secuencia en estos

    – Ben Jones

    21 de agosto de 2019 a las 17:52

  • Buena respuesta. No es el aceptado pero es el que mejor se ajusta a mis necesidades

    –Leonardo Maffei

    21 de enero de 2022 a las 10:45

Ciro Santilli Avatar de usuario de OurBigBook.com
Ciro Santilli OurBigBook.com

prop_cycle

color_cycle fue desaprobado en 1.5 a favor de esta generalización: 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()

Cómo elegir un nuevo color para cada línea trazada dentro de una figura

También se muestra en el ejemplo (ahora mal llamado): http://matplotlib.org/1.5.1/examples/color/color_cycle_demo.html mencionado en: https://stackoverflow.com/a/4971431/895245

Probado en matplotlib 1.5.1.

Avatar de usuario de Andrea Spadaccini
andrea spadaccini

No sé si puede cambiar automáticamente el color, pero podría explotar su ciclo para generar diferentes colores:

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

En este caso, los colores variarán de negro a 100% verde, pero puedes ajustarlo si quieres.

Ver el matplotlib plot() documentos y busca el color argumento de palabra clave.

Si desea alimentar una lista de colores, solo asegúrese de tener una lista lo suficientemente grande y luego use el índice del bucle para seleccionar el color.

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

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

  • Sí, quería evitar hacer algo como esto. Investigué Color Maps, pero estoy bastante confundido sobre cómo usarlos.

    – dlamotte

    11 de febrero de 2011 a las 16:22

  • Esta solución no produce una manera fácil de controlar un mapa de colores.

    – Ryszard Cetnarski

    5 de febrero de 2019 a las 15:48

  • Esto es muy bueno, especialmente cuando falla set_prop_cycle. No sé por qué set_prop_cycle o la coloración automática fallan en plot_wireframe() en Axes3D. Pero esta es una especie de solución básica/manual para colorear.

    – Parque Joonho

    4 de junio de 2020 a las 8:37

Avatar de usuario de Mark Amery
marca amery

Como las notas de respuesta de Ciro, puedes usar prop_cycle para establecer una lista de colores para matplotlib para recorrer. Pero cuantos colores ¿Qué sucede si desea utilizar el mismo ciclo de color para muchos gráficos, con diferentes números de líneas?

Una táctica sería usar una fórmula como la de https://gamedev.stackexchange.com/a/46469/22397para generar una secuencia infinita de colores donde cada color intenta ser significativamente diferente de todos los que le precedieron.

Desafortunadamente, prop_cycle no aceptará secuencias infinitas: se colgará para siempre si pasa una. Pero podemos tomar, digamos, los primeros 1000 colores generados a partir de dicha secuencia y configurarlos como el ciclo de color. De esa forma, para parcelas con cualquier cantidad de líneas, deberías obtener colores distinguibles.

Ejemplo:

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

Producción:

Gráfico de salida por el código de arriba

Ahora, todos los colores son diferentes, ¡aunque admito que me cuesta distinguir algunos de ellos!

  • Sí, quería evitar hacer algo como esto. Investigué Color Maps, pero estoy bastante confundido sobre cómo usarlos.

    – dlamotte

    11 de febrero de 2011 a las 16:22

  • Esta solución no produce una manera fácil de controlar un mapa de colores.

    – Ryszard Cetnarski

    5 de febrero de 2019 a las 15:48

  • Esto es muy bueno, especialmente cuando falla set_prop_cycle. No sé por qué set_prop_cycle o la coloración automática fallan en plot_wireframe() en Axes3D. Pero esta es una especie de solución básica/manual para colorear.

    – Parque Joonho

    4 de junio de 2020 a las 8:37

Avatar de usuario de Chris Seymour
Chris Seymour

También puede cambiar el ciclo de color predeterminado en su matplotlibrc archivo. Si no sabe dónde está ese archivo, haga lo siguiente en Python:

import matplotlib
matplotlib.matplotlib_fname()

Esto le mostrará la ruta a su archivo matplotlibrc actualmente utilizado. En ese archivo encontrará, entre muchas otras configuraciones, también la de axes.color.cycle. Simplemente ingrese la secuencia de colores deseada y la encontrará en cada trama que haga. Tenga en cuenta que también puede usar todos los nombres de color html válidos en matplotlib.

¿Ha sido útil esta solución?