Obtener ciclo de color de línea predeterminado

5 minutos de lectura

avatar de usuario
Pedro

Noté cuando trazaste que la primera línea es azul, luego verde, luego roja, y así sucesivamente.

¿Hay alguna forma de acceder a esta lista de colores? He visto un millón de publicaciones sobre cómo cambiar el ciclo de color o acceder al iterador, pero no sobre cómo obtener la lista de colores que matplotlib recorre de forma predeterminada.

avatar de usuario
tmdavison

En versiones de matplotlib >= 1.5, puede imprimir el rcParam llamó axes.prop_cycle:

print(plt.rcParams['axes.prop_cycle'].by_key()['color'])

# [u'#1f77b4', u'#ff7f0e', u'#2ca02c', u'#d62728', u'#9467bd', u'#8c564b', u'#e377c2', u'#7f7f7f', u'#bcbd22', u'#17becf']

O de manera equivalente, en python2:

print plt.rcParams['axes.prop_cycle'].by_key()['color']

En las versiones color_cycle:

print plt.rcParams['axes.color_cycle']

# [u'b', u'g', u'r', u'c', u'm', u'y', u'k']

Tenga en cuenta que el ciclo de color predeterminado cambió en la versión 2.0.0 http://matplotlib.org/users/dflt_style_changes.html#colors-in-default-property-cycle

  • ¡Gracias! Ligera corrección: La primera debería ser: lines_colour_cycle = [p['color'] for p in plt.rcParams['axes.prop_cycle']]

    – Pedro

    30 de abril de 2017 a las 15:44


  • @Peter, sí, o plt.rcParams['axes.prop_cycle'].by_key()['color']

    – tmdavison

    2 de junio de 2017 a las 15:46

A menudo, no es necesario obtener el ciclo de color predeterminado de ningún lado, ya que es el predeterminado, por lo que basta con usarlo.

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

t = np.arange(5)

for i in range(4):
    line, = ax.plot(t,i*(t+1), linestyle="-")
    ax.plot(t,i*(t+1)+.3,color = line.get_color(), linestyle=":")

plt.show()

ingrese la descripción de la imagen aquí

En caso de que quieras usar el ciclo de color predeterminado para algo diferente, por supuesto, hay varias opciones.

mapa de colores “tab10”

En primer lugar cabe mencionar que la "tab10" El mapa de colores comprende los colores del ciclo de color predeterminado, puede obtenerlo a través de cmap = plt.get_cmap("tab10").

Por lo tanto, equivalente a lo anterior sería

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

t = np.arange(5)
cmap = plt.get_cmap("tab10")
for i in range(4):
    ax.plot(t,i*(t+1),   color=cmap(i), linestyle="-")
    ax.plot(t,i*(t+1)+.3,color=cmap(i), linestyle=":")

plt.show()

Colores del ciclo de color

También puede usar el ciclador de color directamente, cycle = plt.rcParams['axes.prop_cycle'].by_key()['color']. Esto da una lista con los colores del ciclo, que puede usar para iterar.

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

t = np.arange(5)
cycle = plt.rcParams['axes.prop_cycle'].by_key()['color']

for i in range(4):
    ax.plot(t,i*(t+1),   color=cycle[i], linestyle="-")
    ax.plot(t,i*(t+1)+.3,color=cycle[i], linestyle=":")

plt.show()

los CN notación

Finalmente, el CN notación permite obtener la Nth color del ciclo de color, color="C{}".format(i). Sin embargo, esto solo funciona para los primeros 10 colores (N in [0,1,...9])

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

t = np.arange(5)

for i in range(4):
    ax.plot(t,i*(t+1),   color="C{}".format(i), linestyle="-")
    ax.plot(t,i*(t+1)+.3,color="C{}".format(i), linestyle=":")

plt.show()

Todos los códigos presentados aquí producen la misma trama.

  • ¿Es posible decirle a matplotlib que use algún tipo de ciclo? Tener que iterar sobre la matriz de colores significa que debe agregar la lógica para volver al índice 0 después de usar un ciclo completo.

    – Mehdi

    01/03/2019 a las 16:00

  • @Mehdi Claro, matplotlib usa un ciclo de color. Esta pregunta pide obtener los colores de este ciclo.

    – La Importancia De Ser Ernesto

    1 de marzo de 2019 a las 16:06

  • pienso CN la notación debería ser mucho más prominente en su respuesta, casi me la pierdo. Sospecho que la gran mayoría de los casos de uso están contentos con poder acceder solo a los primeros 10 colores y pasar 'C1' un amigo es mucho menos repetitivo que agarrar explícitamente el ciclo de utilería.

    – Andras Deak — Слава Україні

    14 mayo 2019 a las 11:32

  • votado por el CN-notación, era exactamente lo que estaba buscando

    – pcko1

    25 de agosto a las 22:39

avatar de usuario
gboffi

La notación CN revisada

Me gustaría abordar un nuevo desarrollo de Matplotlib. En una respuesta anterior leímos

Finalmente, el CN notación permite obtener la Nth color del ciclo de color, color="C{}".format(i). Sin embargo, esto solo funciona para los primeros 10 colores (N in [0,1,...9])

pero

import numpy as np 
import matplotlib.pyplot as plt 

t = np.linspace(0,6.28, 629)                                                      
for N in (1, 2): 
    C0N, C1N = 'C%d'%(N), 'C%d'%(N+10) 
    plt.plot(t, N*np.sin
    plt.plot(t, N*np.cos
plt.legend() ; plt.grid() ; plt.show()                                           

da

ingrese la descripción de la imagen aquí

  • ¿Podrías añadir un enlace a la fuente? Gracias

    – Lucas

    3 de mayo de 2021 a las 10:28

  • @Luca No tengo fuente, solo descubrí que funciona … En cualquier caso, la fuente definitiva es el código fuente de Matplotlib, pero .../matplotlib/colors.py es> 2000 líneas y, lamentablemente, no he encontrado mi camino cuando busco responder a su pregunta.

    – gboffi

    3 de mayo de 2021 a las 12:48

  • Simplemente muestra una trama y deja que la gente haga sus propias conclusiones. ¿Cuál es el punto en eso?

    – miterhen

    10 de marzo a las 14:38

si está buscando una línea rápida para obtener los colores RGB que matplotlib usa para sus líneas, aquí está:

>>> import matplotlib; print('\n'.join([str(matplotlib.colors.to_rgb(c)) for c in matplotlib.pyplot.rcParams['axes.prop_cycle'].by_key()['color']]))
(0.12156862745098039, 0.4666666666666667, 0.7058823529411765)
(1.0, 0.4980392156862745, 0.054901960784313725)
(0.17254901960784313, 0.6274509803921569, 0.17254901960784313)
(0.8392156862745098, 0.15294117647058825, 0.1568627450980392)
(0.5803921568627451, 0.403921568627451, 0.7411764705882353)
(0.5490196078431373, 0.33725490196078434, 0.29411764705882354)
(0.8901960784313725, 0.4666666666666667, 0.7607843137254902)
(0.4980392156862745, 0.4980392156862745, 0.4980392156862745)
(0.7372549019607844, 0.7411764705882353, 0.13333333333333333)
(0.09019607843137255, 0.7450980392156863, 0.8117647058823529)

O para uint8:

import matplotlib; print('\n'.join([str(tuple(int(round(v*255)) for v in matplotlib.colors.to_rgb(c))) for c in matplotlib.pyplot.rcParams['axes.prop_cycle'].by_key()['color']]))
(31, 119, 180)
(255, 127, 14)
(44, 160, 44)
(214, 39, 40)
(148, 103, 189)
(140, 86, 75)
(227, 119, 194)
(127, 127, 127)
(188, 189, 34)
(23, 190, 207)

¿Ha sido útil esta solución?