Uso de mapas de color para establecer el color de la línea en matplotlib

¿Cómo se establece el color de una línea en matplotlib con los valores escalares proporcionados en el tiempo de ejecución utilizando un mapa de colores (por ejemplo, jet )? Intenté un par de enfoques diferentes aquí y creo que estoy perplejo. values[] es una variedad de escalares. las curvas son un conjunto de matrices 1-d, y las tags son una matriz de cadenas de texto. Cada una de las matrices tiene la misma longitud.

 fig = plt.figure() ax = fig.add_subplot(111) jet = colors.Colormap('jet') cNorm = colors.Normalize(vmin=0, vmax=values[-1]) scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet) lines = [] for idx in range(len(curves)): line = curves[idx] colorVal = scalarMap.to_rgba(values[idx]) retLine, = ax.plot(line, color=colorVal) #retLine.set_color() lines.append(retLine) ax.legend(lines, labels, loc='upper right') ax.grid() plt.show() 

El error que está recibiendo se debe a cómo define jet . Está creando el Colormap clase base con el nombre ‘jet’, pero esto es muy diferente de obtener la definición predeterminada del mapa de colores ‘jet’. Esta clase base nunca debe crearse directamente, y solo se debe crear una instancia de las subclases.

Lo que has encontrado con tu ejemplo es un comportamiento defectuoso en Matplotlib. Debe haber un mensaje de error más claro generado cuando se ejecuta este código.

Esta es una versión actualizada de su ejemplo:

 import matplotlib.pyplot as plt import matplotlib.colors as colors import matplotlib.cm as cmx import numpy as np # define some random data that emulates your indeded code: NCURVES = 10 np.random.seed(101) curves = [np.random.random(20) for i in range(NCURVES)] values = range(NCURVES) fig = plt.figure() ax = fig.add_subplot(111) # replace the next line #jet = colors.Colormap('jet') # with jet = cm = plt.get_cmap('jet') cNorm = colors.Normalize(vmin=0, vmax=values[-1]) scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet) print scalarMap.get_clim() lines = [] for idx in range(len(curves)): line = curves[idx] colorVal = scalarMap.to_rgba(values[idx]) colorText = ( 'color: (%4.2f,%4.2f,%4.2f)'%(colorVal[0],colorVal[1],colorVal[2]) ) retLine, = ax.plot(line, color=colorVal, label=colorText) lines.append(retLine) #added this to get the legend to work handles,labels = ax.get_legend_handles_labels() ax.legend(handles, labels, loc='upper right') ax.grid() plt.show() 

Resultando en:

introduzca la descripción de la imagen aquí

Usar un ScalarMappable es una mejora con respecto al enfoque presentado en mi respuesta relacionada: crear más de 20 colores de leyenda únicos usando matplotlib

Pensé que sería beneficioso incluir lo que considero un método más simple utilizando el espacio de numpy junto con el objeto de tipo cm de matplotlib. Es posible que la solución anterior sea para una versión anterior. Estoy usando python 3.4.3, matplotlib 1.4.3 y numpy 1.9.3., Y mi solución es la siguiente.

 import matplotlib.pyplot as plt from matplotlib import cm from numpy import linspace start = 0.0 stop = 1.0 number_of_lines= 1000 cm_subsection = linspace(start, stop, number_of_lines) colors = [ cm.jet(x) for x in cm_subsection ] for i, color in enumerate(colors): plt.axhline(i, color=color) plt.ylabel('Line Number') plt.show() 

Esto da como resultado 1000 líneas de colores únicos que abarcan todo el mapa de colores de cm.jet como se muestra a continuación. Si ejecuta este script, encontrará que puede ampliar las líneas individuales.

cm. chorro entre 0.0 y 1.0 con 1000 graduaciones.

Ahora diga que quiero que mis 1000 colores de línea solo abarquen la parte verdosa entre las líneas 400 y 600. Simplemente cambio los valores de inicio y parada a 0,4 y 0,6 y esto hace que se use solo el 20% del mapa de color cm. Jet entre 0,4 y 0.6.

cm.jet entre 0,4 y 0,6 con 1000 graduaciones.

Por lo tanto, en un resumen de una línea, puede crear una lista de colores rgba a partir de un mapa de colores matplotlib.cm en consecuencia:

 colors = [ cm.jet(x) for x in linspace(start, stop, number_of_lines) ] 

En este caso, uso el mapa invocado comúnmente llamado jet, pero puede encontrar la lista completa de mapas de colores disponibles en su versión de matplotlib invocando:

 >>> from matplotlib import cm >>> dir(cm) 

Una combinación de estilos de línea, marcadores y colores cualitativos de matplotlib :

 import itertools import matplotlib as mpl import matplotlib.pyplot as plt N = 8*4+10 l_styles = ['-','--','-.',':'] m_styles = ['','.','o','^','*'] colormap = mpl.cm.Dark2.colors # Qualitative colormap for i,(marker,linestyle,color) in zip(range(N),itertools.product(m_styles,l_styles, colormap)): plt.plot([0,1,2],[0,2*i,2*i], color=color, linestyle=linestyle,marker=marker,label=i) plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.,ncol=4); 

introduzca la descripción de la imagen aquí

U puede hacer lo que he escrito desde mi cuenta eliminada (prohibición de nuevas publicaciones 🙁 hubo). Es bastante simple y de aspecto agradable.

Estoy usando 3-rd uno de estos 3 usualmente, también estuve revisando la versión 1 y 2.

 from matplotlib.pyplot import cm import numpy as np #variable n should be number of curves to plot (I skipped this earlier thinking that it is obvious when looking at picture - sorry my bad mistake xD): n=len(array_of_curves_to_plot) #version 1: color=cm.rainbow(np.linspace(0,1,n)) for i,c in zip(range(n),color): ax1.plot(x, y,c=c) #or version 2: - faster and better: color=iter(cm.rainbow(np.linspace(0,1,n))) c=next(color) plt.plot(x,y,c=c) #or version 3: color=iter(cm.rainbow(np.linspace(0,1,n))) for i in range(n): c=next(color) ax1.plot(x, y,c=c) 

ejemplo de 3:

Embarcación RAO de Roll vs Ikeda amortiguación en función de la amplitud de Roll A44