将自定义刻度标签均匀分布在颜色条上

Spread custom tick labels evenly over colorbar

我正在尝试使用 pyplot 将自定义颜色栏添加到我的热图中。 我的代码看起来像这样:

c_map = mpl.colors.ListedColormap(['#c7e9b4','#7fcdbb','#ffffff','#41b6c4','#225ea8','#253494'])
sm = plt.cm.ScalarMappable(cmap=c_map)
cbar = plt.colorbar(sm, ticks=np.arange(6), label='Change in user population')
cbar.ax.set_yticklabels(['<=-6', '<= -1', '0', '<= 3', '<= 6', '7>='])

当前生成以下颜色栏: Wrong colorbar

从图中可以看出,六个刻度标签中只有两个显示在栏的底部和顶部。但是,按照其他人使用的方法,我希望 ticks=np.arange(6) 在将刻度标签更改为指定的字符串值之前将六个标签均匀分布在颜色条上。

我正在寻找一种快速而简单的方法来解决这个问题,因为这是我需要制作的唯一视觉地图。我已经四处寻找了几个小时,但没有成功解决这个问题,所以请帮助这个初学者程序员。

刻度的轴在 0(底部)到 1(顶部)的范围内。 将 space 平均分成 6 个部分,将标记每个颜色区域的底部。添加一半将很好地位于中心。因此,ticks=np.linspace(0,1,6,endpoint=False) + 1/12。或者,等价地,ticks=(np.arange(6)+1/2)/6.

您可以通过将其长度设置为零来删除刻度线:cbar.ax.axes.tick_params(length=0)

要获得正确的 less than or equal,可以选择 TeX format 中的标签。如 r'$\leq-6$'.

一些演示代码:

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

c_map = mpl.colors.ListedColormap(['#c7e9b4','#7fcdbb','#ffffff','#41b6c4','#225ea8','#253494'])
sm = plt.cm.ScalarMappable(cmap=c_map)
cbar = plt.colorbar(sm, ticks=np.linspace(0, 1, 6, endpoint=False) + 1/12, label='Change in user population')
cbar.ax.set_yticklabels([r'$\leq-6$', r'$\geq-1$', '[=10=]$', r'$\leq3$', r'$\leq6$', r'$\geq7$'])
cbar.ax.axes.tick_params(length=0)
plt.show()