在热图颜色条上设置自定义刻度标签

set custom tick labels on heatmap color bar

我有一个名为 merged_dfs 的数据帧列表,我正在循环使用它来获取相关性并使用 seaborn 绘制热图相关矩阵的子图。

我想自定义颜色栏刻度标签,但我无法弄清楚如何使用我的示例来实现。

目前,我的颜色条比例值从上到下是

[1,0.5,0,-0.5,-1]

我想保留这些值,但将刻度标签更改为

[1,0.5,0,0.5,1] 

我发散的颜色条。

这是代码和我的尝试:

fig, ax = plt.subplots(nrows=6, ncols=2, figsize=(20,20))
for i, (title,merging) in enumerate (zip(new_name_data,merged_dfs)):
    graph = merging.corr()
    colormap = sns.diverging_palette(250, 250, as_cmap=True)
    a = sns.heatmap(graph.abs(), cmap=colormap, vmin=-1,vmax=1,center=0,annot = graph, ax=ax.flat[i])
    cbar = fig.colorbar(a)
    cbar.set_ticklabels(["1","0.5","0","0.5","1"])
fig.delaxes(ax[5,1])
        
plt.show()
plt.close()

我不断收到此错误:

AttributeError: 'AxesSubplot' object has no attribute 'get_array'

有几处出错了:

  • fig.colorbar(...) 将创建一个新的颜色条,默认情况下附加到最后创建的子图。
  • sns.heatmap returns 一个 ax(表示一个子图)。这与 matplotlib 函数非常不同,例如plt.imshow(),这将 return 绘制的图形元素。
  • 您可以抑制热图的颜色条 (cbar=False),然后使用您想要的参数重新创建它。
  • fig.colorbar(...) 当图形包含多个子图时需要一个参数 ax=...
  • 您可以通过 cbar_kws=... 将颜色条参数添加到 sns.heatmap,而不是创建新的颜色条。颜色条本身可以通过 ax.collections[0].colobar 找到。 (ax.collections[0] 是 matplotlib 存储包含热图的图形对象的地方。)
  • 使用 Python 时
  • Using an index is strongly discouraged。它通常更具可读性,更易于维护,并且更少 error-prone 将所有内容包含到 zip 命令中。
  • 现在你的 vmin 现在是 -1,取着色的绝对值似乎是错误的。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

merged_dfs = [pd.DataFrame(data=np.random.rand(5, 7), columns=[*'ABCDEFG']) for _ in range(5)]
new_name_data = [f'Dataset {i + 1}' for i in range(len(merged_dfs))]

fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(12, 7))
for title, merging, ax in zip(new_name_data, merged_dfs, axes.flat):
     graph = merging.corr()
     colormap = sns.diverging_palette(250, 250, as_cmap=True)
     sns.heatmap(graph, cmap=colormap, vmin=-1, vmax=1, center=0, annot=True, ax=ax, cbar_kws={'ticks': ticks})
     ax.collections[0].colorbar.set_ticklabels([abs(t) for t in ticks])

fig.delaxes(axes.flat[-1])
fig.tight_layout()
plt.show()