使 plt.colorbar 扩展到 vmin/vmax 前后的步骤
Make plt.colorbar extend to the steps immediately before and after vmin/vmax
我想用 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
设置颜色条,以便将刻度分配给绘制的颜色条的开始和结束?
我想这就是您要找的:
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()
这就是我真正想要的结果:
我想用 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
设置颜色条,以便将刻度分配给绘制的颜色条的开始和结束?
我想这就是您要找的:
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()
这就是我真正想要的结果: