使 plt.colorbar 扩展到 vmin/vmax 前后的步骤

Make plt.colorbar extend to the steps immediately before and after vmin/vmax

我想用 plt.hist2dplt.colorbar 做点什么,但我真的很难弄清楚如何去做。为了解释,我写了下面的例子:

import numpy as np
from matplotlib import pyplot as plt

x = np.random.random(1e6)
y = np.random.random(1e6)

plt.hist2d(x, y)
plt.colorbar()

plt.show()

此代码生成的绘图类似于下图。

如果我生成直方图,理想情况下我希望颜色条超出数据的最大和最小范围延伸到超出最大和最小值的下一步。在此问题的示例中,这会将颜色条范围设置为从 9660 到 10260,增量为 60。

如何强制 plt.hist2dplt.colorbar 设置颜色条,以便将刻度分配给绘制的颜色条的开始和结束?

我想这就是您要找的:

h = plt.hist2d(x, y)
mn, mx = h[-1].get_clim()
mn = 60 * np.floor(mn / 60.)
mx = 60 * np.ceil(mx / 60.)
h[-1].set_clim(mn, mx)
cbar = plt.colorbar(h[-1], ticks=np.arange(mn, mx + 1, 60), )

这给出了类似的东西,

使用 matplotlib.ticker 中的代码和使用 tick_values 方法的代码通常也很方便,但为此我认为上面的方法最方便。

祝你好运!

非常感谢 farenorth,他让我以正确的方式思考这个问题,我想出了一个函数,get_colour_bar_ticks:

def get_colour_bar_ticks(colourbar):
    import numpy as np

    # Get the limits and the extent of the colour bar.
    limits = colourbar.get_clim()
    extent = limits[1] - limits[0]

    # Get the yticks of the colour bar as values (ax.get_yticks() returns them as fractions).
    fractions = colourbar.ax.get_yticks()
    yticks = (fractions * extent) + limits[0]
    increment = yticks[1] - yticks[0]

    # Generate the expanded ticks.
    if (fractions[0] == 0) & (fractions[-1] == 1):
        return yticks

    else:
        start = yticks[0] - increment
        end = yticks[-1] + increment

        if fractions[0] == 0:
            newticks = np.concatenate((yticks, [end]))
        elif fractions[1] == 1:
            newticks = np.concatenate(([start], yticks))
        else:
            newticks = np.concatenate(([start], yticks, [end]))

        return newticks

有了这个功能,我就可以这样做了:

from matplotlib import pyplot as plt

x = np.random.random(1e6)
y = np.random.random(1e6)

h = plt.hist2d(x, y)
cbar = plt.colorbar()

ticks = get_colour_bar_ticks(cbar)

h[3].set_clim(ticks[0], ticks[-1])
cbar.set_clim(ticks[0], ticks[-1])
cbar.set_ticks(ticks)

plt.show()

这就是我真正想要的结果: