type tutorial histograma hist density python matplotlib histogram

python - tutorial - Trazar histograma con colores tomados del mapa de colores



plt.hist density (4)

El comando hist devuelve una lista de parches, por lo que puede iterar sobre ellos y establecer su color de la siguiente 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:

Quiero trazar un histograma 1D simple 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:

En lugar de que el color sea green para todo el histograma, 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) deberían 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 color definido en cm .


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 como este

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


Si bien no es lo que pediste, si alguien más se tropieza con esto (como yo) buscando la manera de hacer la coloración por altura de los contenedores en lugar de ordenar, 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 = (n-n.min())/(n.max()-n.min()) for c, p in zip(col, patches): plt.setp(p, ''facecolor'', cm(c)) plt.show()


Un enfoque alternativo es usar plt.bar que toma una lista de colores. Para determinar los anchos y alturas puede usar numpy.histogram . Su mapa de colores se puede utilizar al encontrar el rango de los valores x y escalarlos 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(((x-X.min())/x_span)) for x in X] plt.bar(X[:-1],Y,color=C,width=X[1]-X[0]) plt.show()