Matplotlib颜色条仅显示最多一半的刻度值

时间:2017-11-10 12:55:38

标签: python matplotlib

使用" ColorbarBase"创建彩条时对象并使用" set_yticklabels"添加刻度线方法matplotlib只显示" ticks"中指定的值的一半。名单。这只是在我升级到最新的matplotlib版本后才开始发生的。

这是一个测试它的简短代码:

    import matplotlib.pyplot as plt
    import matplotlib as mpl
    fig = plt.figure(1)
    cax = fig.add_axes([0.8, 0.15, 0.03, 0.72])
    ticks = range(11)
    cbar = mpl.colorbar.ColorbarBase(cax, cmap='rainbow', orientation='vertical')
    cbar.ax.set_yticklabels(ticks)
    plt.show()

使用matplotlib版本2.1.0我得到一个带有从1到5的刻度的颜色条,同时使用matplotlib版本1.4.3我得到正确的数字,刻度从1到10。

我可以通过将蜱范围增加2来做一个肮脏的修复,但我宁愿这不会发生。关于可能发生什么的任何提示?

1 个答案:

答案 0 :(得分:0)

我认为上面的代码在matplotlib 1.4中工作只是巧合。关键是你没有告诉colorbar它应覆盖的范围。因此它将覆盖范围0 - 1。在2以下的matplotlib版本中,范围为0 - 1的轴将具有11个刻度线(0,0.1,0.2,...);然后将标签设置为range(11)将很好地适合(0保持0,0.1标记为1,等等)。在较新的matplotlib版本中,标签密度默认较低(0,0.2,0.4,...)。因此,您只能获得最多5个标签(0保持0,0.2标记为1,0.4标记为2,等等最多为5)。最后,这种方法非常脆弱,因为刻度密度也受轴的大小影响,可能会发生变化。

所以你想告诉colorbar它应该涵盖哪个范围。一种方法是提供norm

ticks = range(11)
cbar = mpl.colorbar.ColorbarBase(cax, cmap='rainbow', orientation='vertical', 
                                 norm=plt.Normalize(ticks[0],ticks[-1]))

然后,您可以将刻度线和刻度标签设置为ticks内的数字。

cbar.set_ticks(ticks)
cbar.ax.set_yticklabels(ticks)

完整示例:

import matplotlib.pyplot as plt
import matplotlib as mpl
fig = plt.figure(1)
cax = fig.add_axes([0.8, 0.15, 0.03, 0.72])
ticks = range(11)
cbar = mpl.colorbar.ColorbarBase(cax, cmap='rainbow', orientation='vertical', 
                                 norm=plt.Normalize(ticks[0],ticks[-1]))
cbar.set_ticks(ticks)
cbar.ax.set_yticklabels(ticks)
plt.show()

enter image description here