it-swarm.com.de

Zeichnen Sie das Histogramm mit den Farben aus der Colormap

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:

enter image description here

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.

29
Gabriel

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:

enter image description here

34
Bas Swinckels

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

enter image description here

13
Hooked

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

 enter image description here

2
Alnilam

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