使用从colormap中获取的颜色绘制直方图

时间:2014-04-14 13:39:18

标签: python matplotlib histogram

我想绘制一个简单的一维直方图,其中条形应遵循给定色图的颜色编码。

这里是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()

输出:

enter image description here

我不希望整个直方图的颜色为green,而是希望这些列遵循cm中定义的色彩图和{{bins中定义的颜色编码。 1}}。这意味着根据所选择的色彩图RdYlBu_r,接近于零(不是高度但在位置上)的箱子应该看起来更蓝,而且接近一个更红的箱子。

由于plt.histo没有参加cmap论证,我不知道如何告诉它使用cm中定义的色彩映射。

4 个答案:

答案 0 :(得分:34)

hist命令返回一个补丁列表,因此您可以迭代它们并设置它们的颜色,如下所示:

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

要获得颜色,您需要call the colormap with a value between 0 and 1。得出的数字:

enter image description here

答案 1 :(得分:13)

另一种方法是使用plt.bar来获取颜色列表。要确定宽度和高度,可以使用numpy.histogram。可以通过查找x值的范围并将它们从0缩放到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()

enter image description here

答案 2 :(得分:4)

虽然它不是你要求的,但是如果有人偶然发现这个(就像我一样)寻找按箱子的高度而不是顺序进行着色的方法,那么基于Bas的答案的下列代码就可以了:

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

答案 3 :(得分:0)

我喜欢Bas Swinckels答案,但鉴于colormap cm将参数作为0到1之间的值,一个更简单的算法就像这样

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