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

时间:2015-09-15 12:40:55

标签: python matplotlib colorbar histogram2d

我想对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()

此代码生成的图形看起来如下图所示。 2D histogram with colorbar plotted using pyplot

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

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

2 个答案:

答案 0 :(得分:3)

我认为这是你正在寻找的东西:

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), )

这就像是,

enter image description here

使用matplotlib.ticker中的代码通常也很方便,并使用代理商的tick_values方法,但为此我认为以上是最方便的。

祝你好运!

答案 1 :(得分:3)

非常感谢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()

这导致了这一点,这就是我真正想要的:

enter image description here