【问题标题】:specific outliers on a heat map- matplotlib热图上的特定异常值 - matplotlib
【发布时间】:2014-03-31 13:37:30
【问题描述】:

我正在使用具有固定异常值的数据生成热图,我需要将这些异常值显示为我使用的 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

感谢任何帮助

【问题讨论】:

  • 乔的回答解释了你需要做什么。我建议关注它。

标签: python matplotlib heatmap colorbar outliers


【解决方案1】:

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

因此,它们不会在颜色栏上显示为“结束”。 (即就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()

如果我们根本不将其设为掩码数组,而是将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()

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

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

【讨论】:

  • 我使用 vmax 作为异常值,但它仍然是相同的输出。我已经编辑了我的问题以包括我现在正在运行的代码以及我使用的数据!
【解决方案2】:

我认为您需要将extend 设置为"both" 并输入Normalize 对象:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas

from io import StringIO # python 3
#from StringIO import StringIO # python 2

datastring = StringIO("""\
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
""")

threshold = 1.68
data = pandas.read_table(datastring, sep=';', index_col='Data')
cmap = mpl.cm.coolwarm
norm = mpl.colors.Normalize(vmin=-1 * threshold, vmax=threshold)
cmap.set_over('slategray')
cmap.set_under('forestgreen')

fig, ax = plt.subplots()
ax.set_aspect('equal')
cb_ax=fig.add_axes([0.85, 0.1, 0.03, 0.8])
img = ax.imshow(data, cmap=cmap, norm=norm, interpolation='none')
cb = mpl.colorbar.ColorbarBase(cb_ax, cmap=cmap, norm=norm, extend='both')

给我:

【讨论】:

  • 我添加了归一化对象: norm = mpl.colors.Normalize(vmin=negative_outlier,vmax=outlier) cmap.set_over('green') img=plt.imshow(data, interpolation='none ', cmap=cmap,norm=norm) cb=mpl.colorbar.ColorbarBase(cb_ax,cmap=cmap,norm=norm,extend='both',spacing='uniform') 但结果还是一样...白色空间而不是绿色
  • 不,它没有,它仍然给我所有异常值的空白而不是绿色。颜色条用标准对象固定,但不是热图。我仍然必须使用 set_bad 和 masking 属性才能使其工作。不知道出了什么问题,因为您生成的地图在没有 set_bad 的情况下合并了这些异常值..(我已经编辑了我的帖子以包含您提到的更改)
  • @user2998764 好吧,在没有看到您的数据的情况下,我已经尽可能地带您走了。编辑您的问题以包含它。
  • @user2998764 查看我修改后的回复
猜你喜欢
  • 2014-03-28
  • 2013-11-03
  • 2012-08-06
  • 2014-08-29
  • 2019-06-15
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多