Trazar histogtwig con colores tomados de mapa de colores

Quiero trazar un simple histogtwig 1D donde las barras deben seguir el código de colores de un mapa de colores dado.

Aquí hay un MWE :

 import numpy as n import matplotlib.pyplot as plt # Random gaussian data. Ntotal = 1000 data = 0.05 * n.random.randn(Ntotal) + 0.5 # This is the colormap I'd like to use. cm = plt.cm.get_cmap('RdYlBu_r') # Plot histogram. n, bins, patches = plt.hist(data, 25, normed=1, color='green') plt.show() 

que produce esto:

introduzca la descripción de la imagen aquí

En lugar de que el color sea green para todo el histogtwig, me gustaría que las columnas sigan un código de colores dado por el mapa de colores definido en cm y los valores de los bins . Esto significaría que los contenedores más cercanos a cero ( no en altura sino en posición) deben verse más azules y los más cercanos a uno más rojo, de acuerdo con el mapa de RdYlBu_r elegido RdYlBu_r .

Como plt.histo no toma un argumento de cmap , no sé cómo decirle que use el mapa de colores definido en cm .

El comando hist devuelve una lista de parches, por lo que puede iterar sobre ellos y establecer su color de esta manera:

 import numpy as n import matplotlib.pyplot as plt # Random gaussian data. Ntotal = 1000 data = 0.05 * n.random.randn(Ntotal) + 0.5 # This is the colormap I'd like to use. cm = plt.cm.get_cmap('RdYlBu_r') # Plot histogram. n, bins, patches = plt.hist(data, 25, normed=1, color='green') bin_centers = 0.5 * (bins[:-1] + bins[1:]) # scale values to interval [0,1] col = bin_centers - min(bin_centers) col /= max(col) for c, p in zip(col, patches): plt.setp(p, 'facecolor', cm(c)) plt.show() 

Para obtener los colores, debe llamar al mapa de colores con un valor entre 0 y 1 . Figura resultante:

introduzca la descripción de la imagen aquí

Un enfoque alternativo es usar plt.bar que toma en una lista de colores. Para determinar los anchos y las alturas, puede usar numpy.histogram . Puede utilizar su mapa de colores buscando el rango de los valores de x y escalando de 0 a 1.

 import numpy as n import matplotlib.pyplot as plt # Random gaussian data. Ntotal = 1000 data = 0.05 * n.random.randn(Ntotal) + 0.5 # This is the colormap I'd like to use. cm = plt.cm.get_cmap('RdYlBu_r') # Get the histogramp Y,X = n.histogram(data, 25, normed=1) x_span = X.max()-X.min() C = [cm(((xX.min())/x_span)) for x in X] plt.bar(X[:-1],Y,color=C,width=X[1]-X[0]) plt.show() 

introduzca la descripción de la imagen aquí

Si bien no es lo que pediste, si alguien más se tropieza con esto (como yo lo hice) buscando la manera de hacer la coloración por altura de los contenedores en lugar del orden, el siguiente código basado en la respuesta de Bas funcionaría:

 import numpy as np import matplotlib.pyplot as plt Ntotal = 1000 data = 0.05 * np.random.randn(Ntotal) + 0.5 cm = plt.cm.get_cmap('RdYlBu_r') n, bins, patches = plt.hist(data, 25, normed=1, color='green') # To normalize your values col = (nn.min())/(n.max()-n.min()) for c, p in zip(col, patches): plt.setp(p, 'facecolor', cm(c)) plt.show() 

introduzca la descripción de la imagen aquí

Me gusta la respuesta de Bas Swinckels, pero dado que el mapa de color cm toma como parámetro un valor entre 0 y 1, un algoritmo más simple sería así

 import matplotlib.pyplot as plt Ntotal = 1000 data = 0.05 * n.random.randn(Ntotal) + 0.5 cm = plt.cm.RdBu_r n, bins, patches = plt.hist(data, 25, normed=1, color='green') for i, p in enumerate(patches): plt.setp(p, 'facecolor', cm(i/25)) # notice the i/25 plt.show()