我正在按照以下方式将共享颜色条添加到子图:Matplotlib 2 Subplots, 1 Colorbar但是对于水平颜色条,我找不到给定轴的正确位置的属性或方法来定位新颜色条轴使用add_axes()
方法。
例如:
import numpy as np
import matplotlib
matplotlib.use('macosx')
import matplotlib.pyplot as plt
im = np.random.rand(512, 512)
fig, axs = plt.subplots(3,1, figsize=(4, 9))
ims = [axs[i].imshow(im, cmap='gray', origin='lower') for i in range(3)]
pos = axs[-1].get_position()
fig.subplots_adjust(bottom = 0.2)
cbar_ax = fig.add_axes([pos.x0, 0.1, pos.width, 0.04])
fig.colorbar(ims[2], cax=cbar_ax, orientation='horizontal')
其中给出了以下结果:
其中颜色条明显与之前的水平轴不对齐,我猜这来自get_position()
给出的不适当的值
我还尝试使用涉及的其他方法:
divider = make_axes_locatable(axs[-1])
cax_bottom = divider.append_axes('bottom', size="5%", pad=0.5)
fig.colorbar(ims[-1], cax=cax_bottom)
但这会调整底部数字的大小,所以我的第一次尝试似乎更准确,尽管我仍然缺少给出轴的适当位置的参数以使其工作。
[编辑]我还查看了评论中提供的其他链接。解决方案都没有解决这个问题。 SO链接中的第二个答案有一个我没试过的第三个选项,它使用了另一个颜色栏本身的子图,但它也没有解决问题:
# Using an axis for colorbar within subplots
fig, axs = plt.subplots(4,1, figsize=(4, 9), gridspec_kw={"height_ratios":[1, 1, 1, 0.05]})
ims = [axs[i].imshow(im, cmap='gray', origin='lower') for i in range(3)]
fig.colorbar(ims[2], cax=axs[-1], orientation='horizontal')
[编辑2]在重复的问题中调整解决方案,这是一个有效的解决方案:
import numpy as np
import matplotlib
matplotlib.use('macosx')
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
from mpl_toolkits.axes_grid1.inset_locator import InsetPosition
im = np.random.rand(512, 512)
fig, axs = plt.subplots(4,1, figsize=(3.5, 9), gridspec_kw={"height_ratios":[1, 1, 1, 0.07]})
ims = [axs[i].imshow(im, cmap='gray', origin='lower') for i in range(3)]
fig.subplots_adjust(bottom=0.05, top=0.95)
# Use negative value for the bottom position.
ip = InsetPosition(axs[2], [0, -0.2, 1, 0.05])
axs[-1].set_axes_locator(ip)
fig.colorbar(ims[2], cax=axs[-1], ax=[axs[0], axs[1], axs[2]], orientation='horizontal')
axs[-1].set_xlabel('title')
在InsetPosition
中需要使用负值,因为它相对于它正上方的轴定位它。最后,subplots_adjust()
的使用必须适合紧密贴合,而不是使用tight_layout()
来截断颜色栏或其标签和标题。