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

Posted

技术标签:

【中文标题】使用从颜色图中获取的颜色绘制直方图【英文标题】:Plot histogram with colors taken from colormap 【发布时间】:2014-05-28 12:07:39 【问题描述】:

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

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

输出这个:

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

由于plt.histo 不接受cmap 参数,我不知道如何告诉它使用cm 中定义的颜色图。

【问题讨论】:

【参考方案1】:

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。结果图:

【讨论】:

我希望你不介意 - imgur 在我的工作中没有被阻止,所以我继续添加了你的照片。我认为这两种方法都很好地解决了这个问题! 嗯,如果图像正确,那么代码没有做我需要的。颜色编码与条形 heigth 相关联,我需要它与 bins 值 相关联。请参阅@Hooked 答案以了解我的意思。 @Gabriel 确实,Bas 的答案与您想要的颜色编码方案不匹配 - 但重要的是要带走我们正在使用 不同的方法setpbar。每个都有其优点,可以在此答案中轻松修改颜色条的映射以获得您正在寻找的那个。 @BasSwinckels 您也许可以通过代理(比如谷歌翻译)使用网站网址来至少查看图像,如果不编辑它们。 虽然@Hooked 的答案也很好,但我将其标记为已接受,因为它更接近于问题中提供的代码。谢谢你们!【参考方案2】:

另一种方法是使用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()

【讨论】:

【参考方案3】:

虽然这不是您所要求的,但如果其他人偶然发现此问题(就像我所做的那样)寻找按箱子的高度而不是顺序进行着色的方法,则基于 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()

【讨论】:

【参考方案4】:

我喜欢 Bas Swinckels 的回答,但鉴于颜色图 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()

【讨论】:

以上是关于使用从颜色图中获取的颜色绘制直方图的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用ggplot2包的快速可视化函数qplot绘制分组直方图(分组颜色设置)实战

根据“计数”列绘制直方图连续颜色?

R语言使用ggplot2包使用geom_density()函数绘制分组密度图(添加直方图分组颜色配置)实战(density plot)

用ggplot2直方图中另一个连续变量的平均值填充条形颜色

R ggplot 直方图。如何根据另一个变量更改条形的颜色?

Halcon_灰度直方图和特征直方图的使用