热图上的中心颜色条标签

Center colorbar Labels on Heatmap

我已经看到了一些与此类似的问题,但一直无法解决问题,所以我想我会在这里问一下。

我有一个带有 2 个重叠散点图的 seaborn 热图。当它绘制颜色条时,标签不以颜色为中心。我想知道如何将值集中在颜色上。也可以始终将 0 颜色设置为白色吗?我的代码和情节如下

fig, ax = plt.subplots(figsize=(20, 20))

plt.gca().set_aspect(RI/SI)
cbar_kws=dict(pad=0.01,shrink=0.86, drawedges=True, ticks=range(int(maxfold)+1)) #Colorbar size and location 

cmap = plt.get_cmap('jet', maxfold+1)

sns.heatmap(binspivot, cmap=cmap,linewidths=0.01, linecolor = 'black', vmin=0, vmax=maxfold, xticklabels=False, yticklabels=False,annot=True, annot_kws={"size": 20,"color":"black"},cbar_kws=cbar_kws)
ax.set(xlabel=None, ylabel=None)
ax.scatter(Sourcedfcut['Xmod'],Sourcedfcut['Ymod'], color="red", s = 400)
ax.scatter(Recdfcut['Xmod'],Recdfcut['Ymod'], color="blue", s= 400)

让颜色栏的刻度线位于矩形中心的最简单方法是将 vminvmax 移动一半。要向现有颜色图中添加额外的颜色,可以使用该新颜色和从原始颜色图中提取的颜色创建新的 ListedColormap。要使颜色条中的白色在白色背景下可见,可以添加黑色环绕矩形。

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import seaborn as sns
import numpy as np

binspivot = (12.02 * np.random.rand(20, 20) ** .5).astype(int)
maxfold = binspivot.max()
fig, ax = plt.subplots(figsize=(20, 20))

cbar_kws = dict(pad=0.01, shrink=0.86, drawedges=True, ticks=range(int(maxfold) + 1))  # Colorbar size and location

cmap1 = plt.get_cmap('turbo', maxfold + 1)
colors = ['white'] + list(plt.get_cmap('turbo', maxfold).colors)
cmap = ListedColormap(colors=colors)

sns.heatmap(binspivot, cmap=cmap, linewidths=0.01, linecolor='black', vmin=-0.5, vmax=maxfold + 0.5,
            xticklabels=False, yticklabels=False,
            annot=True, annot_kws={"size": 20}, cbar_kws=cbar_kws, ax=ax)
ax.set(xlabel=None, ylabel=None)
cbar_ax = fig.axes[-1]
cbar_ax.tick_params(labelsize=20)
cbar_ax.add_patch(plt.Rectangle((0, 0), 1, 1, fc='none', ec='black', clip_on=False, transform=cbar_ax.transAxes))
plt.tight_layout()
plt.show()