我想对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()
如果我生成直方图,理想情况下我希望颜色条超出数据的最大和最小范围,超出最大值和最小值的下一步。在此问题的示例中,这会将颜色条范围从9660设置为10260,增量为60.
如何强制plt.hist2d
或plt.colorbar
设置颜色条,以便将刻度分配给绘制的颜色条的开头和结尾?
答案 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), )
这就像是,
使用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()
这导致了这一点,这就是我真正想要的: