python - 热图上的特定异常值 - matplotlib

标签 python matplotlib heatmap colorbar outliers

我正在使用具有固定离群值的数据生成热图,我需要将这些离群值显示为我使用的“热”cmap 调色板之外的颜色。通过使用 cmap.set_bad('green') 和 np.ma.masked_values(data, outlier),我得到了一个看起来正确的图,但是即使我使用 cmap.set_over,颜色条也没有与数据正确同步('绿色的')。 这是我一直在尝试的代码:

plt.xlim(0,35)
plt.ylim(0,35)
img=plt.imshow(data, interpolation='none',norm=norm, cmap=cmap,vmax=outlier)

cb_ax=fig.add_axes([0.85, 0.1, 0.03, 0.8])

cb=mpl.colorbar.ColorbarBase(cb_ax,cmap=cmap,norm=norm,extend='both',spacing='uniform')
cmap.set_over('green')
cmap.set_under('green')

这是数据(离群值显然是 1.69):

Data;A;B;C;D;E;F;G;H;I;J;K    
A;1.2;0;0;0;0;1.69;0;0;1.69;1.69;0    
B;0;0;0;0;0;1.69;0;0;1.69;1.69;0    
C;0;0;0;0;0;1.69;0;0.45;1.69;1.69;0.92    
D;1;0;-0.7;-1.2;0;1.69;0;0;1.69;1.69;0    
E;0;0;0;0;0;1.69;0;0;1.69;1.69;0    
F;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69    
G;0;0;0;0;0;1.69;0;0;1.69;1.69;0    
H;0;0;0;0;0;1.69;0;0;1.69;1.69;0    
I;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69
J;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69;1.69
K;0;0;0;0;0;1.69;0;0;1.69;1.69;0

感谢任何帮助

最佳答案

发生的情况是您使用的是屏蔽数组,其中屏蔽了异常值。

因此,它们不会在颜色条上显示为“结束”。 (即就matplotlib而言,掩码值无效,未超过阈值)

作为重现问题的独立示例:

import numpy as np
import matplotlib.pyplot as plt

threshold = 0.8
data = np.random.random((10,10))
data = np.ma.masked_greater(data, threshold)

fig, ax = plt.subplots()
im = ax.imshow(data, cmap=plt.cm.hot, interpolation='none')
cbar = fig.colorbar(im, extend='max')
cbar.cmap.set_over('green')

plt.show()

enter image description here

如果我们不将其设为屏蔽数组,而是将 vmax kwarg 指定给 imshow:

import numpy as np
import matplotlib.pyplot as plt

threshold = 0.8
data = np.random.random((10,10))

fig, ax = plt.subplots()
im = ax.imshow(data, cmap=plt.cm.hot, interpolation='none', vmax=threshold)
cbar = fig.colorbar(im, extend='max')
cbar.cmap.set_over('green')

plt.show()

enter image description here

基本上,这就是set_over(或under)和set_bad之间的区别。

如果您仍然想使用屏蔽数组,您可以调用 cbar.cmap.set_bad('green') 以及 set_over,然后您d 得到你想要的效果(尽管所有“坏”值,而不仅仅是超过阈值的值,都会是绿色的)。如果采用该路线,则需要手动指定 vmax。否则,它将被视为数组未屏蔽部分的最大值。

关于python - 热图上的特定异常值 - matplotlib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22080126/

相关文章:

python - 在 matplotlib 图中使用 Pandas 数据帧索引作为 x 轴的值

python - 无法查看美国各州热图

Python 使用 Matplotlib 将总计添加到绘图中

R:heatmap.2 更改颜色键

r - 为什么 R 中的 heatmap.2 无法读取数字数据框?

javascript - 转换 ArcGis 地理坐标 Lat Long wkid : 4326 to Projected Coordinates wkid: 102000/3857

python - 提高性能 : Remove all strings in a (big) list appearing only once

python - Python 是一种弱类型语言,因为变量可以切换类型吗?

python - 如何使jpg图像半透明?

python - FFT 与傅立叶分量的最小二乘拟合?