Matplotlib imshow - 更改默认的颜色归一化

53
我在使用imshow时一直遇到颜色映射的问题;有些颜色似乎会变成黑色。我终于意识到imshow似乎默认会对我提供的浮点值矩阵进行归一化。
我本以为像[[0,0.25],[0.5,0.75]]这样的数组会显示与绝对值相对应的适当颜色,但是0.75会被解释为1。在极端情况下,一个N x N的0.2数组(例如),只会产生一个大黑方块,而不是我们期望的颜色映射中0.2对应的颜色(也许是20%的灰色)。
有没有办法阻止这种行为?当自定义颜色映射存在许多不连续性时,这特别令人恼火;尺度的微小变化可能导致所有颜色完全改变。
2个回答

90

只需指定vmin=0, vmax=1

默认情况下,imshow将数据归一化为其最小值和最大值。您可以使用vminvmax参数或norm参数(如果需要非线性缩放)来控制此过程。

以下是一个快速示例:

import matplotlib.pyplot as plt

data = [[0, 0.25], [0.5, 0.75]]

fig, ax = plt.subplots()
im = ax.imshow(data, cmap=plt.get_cmap('hot'), interpolation='nearest',
               vmin=0, vmax=1)
fig.colorbar(im)
plt.show()

这里输入图片描述


10
我的生活已经圆满!这个问题困扰我太久了。希望这能帮助其他人。 - oLas
1
是的,我已经在网上疯狂搜索了很久,试图弄清楚imshow的行为。 - Nima Mousavi
@DeeWBee 是的。根据文档除了fignum之外,关键字参数都会传递给imshow()函数。 - oLas
实际上,“vmin和vmax不会对数据进行归一化,而是将其夹紧”。这是在此处的评论中提到的(https://dev59.com/mIzda4cB1Zd3GeqPpq8w#31234563)。 - Mohit Pandey
colorbar 这就是我在寻找的 :D - Brambor

0
你还可以通过图像上定义的Normalize对象,在imshow调用之后更新vminvmaxNormalize对象定义了autoscale()方法,可以更新vminvmax
import matplotlib.pyplot as plt

data = [[0, 0.25], [0.5, 0.75]]

im = plt.imshow(data, cmap='hot')
plt.colorbar(im)
im.norm.autoscale([0, 1])
#                 ^^^^^^    <---- smaller value -> vmin; greater value -> vmax

此外,clim() 函数可以用来更新当前图像的 vmin/vmax 值。
im = plt.imshow(data, cmap='hot')
plt.colorbar(im)
plt.clim(0, 1)

image

顺便提一下,可以通过Axes实例的images属性来访问图像,例如im = plt.gca().images[0]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接