在热图颜色条上设置自定义刻度标签
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()
我有一个名为 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()