Obtener ciclo de color de línea predeterminado

95

Me di cuenta cuando trazaste que la primera línea es azul, luego verde, luego roja, y así sucesivamente.

¿Existe 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.

Pedro
fuente

Respuestas:

119

En las versiones de matplotlib> = 1.5, puede imprimir el rcParamllamado 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 equivalentemente, en python3:

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

En las versiones <1.5, esto se llamó 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

tmdavison
fuente
3
¡Gracias! Ligera corrección: la primera debería ser:lines_colour_cycle = [p['color'] for p in plt.rcParams['axes.prop_cycle']]
Peter
4
@Peter, sí, oplt.rcParams['axes.prop_cycle'].by_key()['color']
tmdavison
91

A menudo, no es necesario obtener el ciclo de color predeterminado desde cualquier lugar, 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 desee utilizar el ciclo de color predeterminado para algo diferente, existen, por supuesto, varias opciones.

mapa de colores "tab10"

Primero debe mencionarse que el "tab10"mapa de colores comprende los colores del ciclo de color predeterminado, puede obtenerlo a través de cmap = plt.get_cmap("tab10").

Equivalente a lo anterior sería por tanto

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 utilizar el dispositivo de ciclos 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()

La CNnotación

Por último, la CNnotación que permite obtener la NXX 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 el mismo gráfico.

Importancia de ser Ernesto
fuente
¿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
@Mehdi Claro, matplotlib usa un ciclo de color. Esta pregunta pide obtener los colores de este ciclo.
ImportanceOfBeingErnest
5
Creo que la CNnotación debería ser mucho más prominente en tu respuesta, casi me la pierdo. Sospecho que la gran mayoría de los casos de uso está contento 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 accesorios.
Andras Deak
3

La notación CN revisada

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

Por último, la CNnotación que permite obtener la NXX 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(t), c=C0N, ls='-',  label='c='+C0N) 
    plt.plot(t, N*np.cos(t), c=C1N, ls='--', label='c='+C1N) 
plt.legend() ; plt.grid() ; plt.show()                                           

da

ingrese la descripción de la imagen aquí

gboffi
fuente
2

si está buscando un resumen rápido 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)
Pedro
fuente