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

Gab*_*iel 32 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()
Run Code Online (Sandbox Code Playgroud)

输出这个:

在此输入图像描述

green我希望这些列不是用于整个直方图的颜色,而是遵循由定义的颜色映射cm和颜色值给出的颜色编码bins.根据所选择的色彩图,这意味着接近于零(不在高度但在位置上)的箱应该看起来更蓝并且更接近一个更红RdYlBu_r.

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

Bas*_*els 37

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()
Run Code Online (Sandbox Code Playgroud)

要获取颜色,您需要使用0到1之间的值调用colormap.得出的数字:

在此输入图像描述


Hoo*_*ked 15

另一种方法是使用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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Aln*_*lam 6

虽然这不是您所要的,但是如果有人偶然发现了这个问题(如我所做的那样),正在寻找一种按照箱的高度而不是按顺序进行着色的方法,则基于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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明