Ich möchte ein einfaches 1D-Histogramm zeichnen, bei dem die Balken der Farbcodierung einer bestimmten Colormap folgen sollen.
Hier ist eine 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()
welche gibt dies aus:
Anstelle der Farbe green
für das gesamte Histogramm möchte ich, dass die Spalten einer Farbkodierung folgen, die von der in cm
definierten Farbkarte und den Werten von bins
angegeben wird. Dies würde bedeuten, dass Bins näher an Null ( nicht in der Höhe, aber in Position) blau und diejenigen, die näher an einem Roter liegen, entsprechend der gewählten Farbkarte RdYlBu_r
aussehen sollten.
Da plt.histo
kein cmap
-Argument benötigt, kann ich nicht sagen, dass er die in cm
definierte Colormap verwenden soll.
Der Befehl hist
gibt eine Liste von Patches zurück. Sie können sie also durchlaufen und ihre Farbe wie folgt festlegen:
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()
Um die Farben zu erhalten, müssen Sie die Farbkarte mit einem Wert zwischen 0 und 1 aufrufen. Resultierende Figur:
Ein alternativer Ansatz ist die Verwendung von plt.bar
, das eine Liste von Farben aufnimmt. Um die Breiten und Höhen zu bestimmen, können Sie numpy.histogram
verwenden. Sie können Ihre Colormap verwenden, indem Sie den Bereich der x-Werte ermitteln und von 0 auf 1 skalieren.
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()
Auch wenn es nicht das ist, wonach Sie gefragt haben, wenn jemand anderes (wie ich) darüber stolpert und nach der Möglichkeit sucht, die Farbe nach der Höhe der Behälter anstelle der Reihenfolge zu sortieren, funktioniert der folgende Code, der auf der Antwort von Bas basiert:
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()
Ich mag die Antwort von Bas Swinckels, aber da die colormap cm als Parameter einen Wert zwischen 0 und 1 annimmt, wäre ein einfacherer Algorithmus so
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()