我有一列 matshow 图像,在底部图像下方,我想放置一个宽度与图像相同的颜色条。
我尝试遵循 Set Matplotlib colorbar size to match graph 的建议,但实现此操作会缩小底部图:
MWE:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
fig, axes = plt.subplots(nrows=2, ncols=1, dpi=200)
for ax in axes.flat:
im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)
divider = make_axes_locatable(axes[1])
cax = divider.append_axes("bottom", size="5%", pad=0.25)
fig.colorbar(im, orientation='horizontal', cax=cax)
plt.show()
使用
divider
可以从 ax
中窃取空间(此处的高度)。
由于使用了 matshow
,ax
的长宽比应该为 1,因此它的宽度也会缩小。
一种解决方案是独立为颜色条创建
cax
,然后强制其具有ax
的宽度:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.transforms import Bbox
fig, (*axes, cax) = plt.subplots(3, 1, gridspec_kw={"height_ratios": [1, 1, 0.05]})
for ax in axes:
im = ax.imshow(np.random.random((10, 10)), vmin=0, vmax=1)
fig.colorbar(im, orientation="horizontal", cax=cax)
(xmin, _), (xmax, _) = axes[0].get_position().get_points()
(_, ymin), (_, ymax) = cax.get_position().get_points()
cax.set_position(Bbox([[xmin, ymin], [xmax, ymax]]))
plt.show()