【问题标题】:How to accentuate subtler traits (smaller numbers) in a heat map?如何在热图中突出更细微的特征(较小的数字)?
【发布时间】:2019-12-16 13:30:01
【问题描述】:

我试图绘制这些数字的热图:

[[0.578, 0.261, 0.218, 0.177, 0.128, 0.125, 0.119],
 [0.113, 0.111, 0.096, 0.095, 0.093, 0.088, 0.083],
 [0.081, 0.078, 0.077, 0.072, 0.071, 0.07, 0.07],
 [0.069, 0.068, 0.068, 0.067, 0.067, 0.06, 0.06],
 [0.059, 0.058, 0.058, 0.058, 0.056, 0.056, 0.056],
 [0.055, 0.055, 0.053, 0.051, 0.051, 0.051, 0.051],
 [0.05, 0.049, 0.048, 0.048, 0.048, 0.047, 0.047]]

正如我们所见,第一个数字 (0.578) 和最后一个数字 (0.047) 之间存在巨大差异。因此,这是我得到的热图:

这是我使用的代码:

out_arr = np.asarray(x) ## x is the list of values that I mentioned above
a = out_arr
a = np.expand_dims(a, axis=0)
plt.imshow(x, cmap='plasma', aspect  ='auto')
plt.show()

我的问题是如何在不丢失实际差异的同时在颜色上带来更大的对比度?例如,在第 2 行之后,几乎所有其他人看起来都相似。当我希望在这些热图上运行图像识别模型时,更大的对比度会有所帮助。

谢谢,

【问题讨论】:

  • 您是否尝试过使用不同的颜色图?
  • 是的。我尝试过除等离子体之外的“酷”和“热”,两者都给出了相似的结果。有没有其他颜色可以显示这些差异。
  • 另外,使用像 seaborn 这样的不同库会有帮助吗?谢谢!
  • 可能不会,因为右下角的值非常接近。您可以应用非线性变换,例如取平方或更高的幂,但显然这会扭曲您的数据。

标签: python matplotlib heatmap


【解决方案1】:

我是问题的作者。我可以得到想要的结果,方法如下:

将列表转换为我们可以使用的 numpy 数组:

import numpy as np
out_arr = np.asarray(x) 
a = out_arr

然后把标准热图变成对数热图:


import math
import seaborn as sn
from matplotlib.colors import LogNorm

data = a

log_norm = LogNorm(vmin=data.min().min(), vmax=data.max().max())
cbar_ticks = [math.pow(10, i) for i in range(math.floor(math.log10(data.min().min())), 1+math.ceil(math.log10(data.max().max())))]

sn.heatmap(
    data,
    cmap = 'plasma',
    norm=log_norm,
    cbar_kws={"ticks": cbar_ticks}
)

这是原始热图和新热图的比较 -

原文:

修改:

可以看出,修改后的 heartmpa 提供了更好的颜色变化。

PS:这是我对 SO 的第一个回答,欢迎批评。另外,感谢 @ImportanceOfBeingErnest 为我指明了正确的方向

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2017-12-11
    • 2019-07-31
    • 2016-08-20
    • 2015-02-28
    • 2016-02-12
    相关资源
    最近更新 更多