4

我想做一些事情,plt.hist2d而且plt.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()

此代码生成一个类似于下图的图。 使用 pyplot 绘制带有颜色条的 2D 直方图

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

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

4

2 回答 2

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

这导致了这个,这是我真正想要的:

在此处输入图像描述

于 2015-09-15T13:51:51.197 回答
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), )

这给出了类似的东西,

在此处输入图像描述

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

祝你好运!

于 2015-09-15T12:58:55.233 回答