我正在创建一些子图,每个子图的底部都有自己的颜色条。使用以下命令添加颜色条:
cax, kw = mcbar.make_axes_gridspec(ax, orientation='horizontal',
pad=pad,
fraction=0.07, shrink=0.85, aspect=35)
figure.colorbar(cs, cax=cax, orientation='horizontal')
调整参数,pad使得如果没有 xticklabels,则值更小,以避免浪费空间。
完整的脚本:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colorbar as mcbar
x = np.linspace(-1, 1, 100)
y = np.linspace(-1, 1, 50)
X, Y = np.meshgrid(x, y)
Z = X**2+np.sin(Y)
figure = plt.figure(figsize=(12, 10))
nrow = 3
ncol = 2
for ii in range(nrow*ncol):
ax = figure.add_subplot(nrow, ncol, ii+1)
row, col = np.unravel_index(ii, (nrow, ncol))
cs = ax.contourf(X, Y, Z)
if row == nrow-1:
# larger padding to make room for xticklabels
pad = 0.15
else:
# smaller padding otherwise
pad = 0.05
ax.tick_params(labelbottom=False)
if row == 1 and col == 1:
# add xlabel would need more padding
ax.set_xlabel('X')
cax, kw = mcbar.make_axes_gridspec(ax, orientation='horizontal',
pad=pad,
fraction=0.07, shrink=0.85, aspect=35)
figure.colorbar(cs, cax=cax, orientation='horizontal')
ax.set_title(str(ii+1))
figure.tight_layout()
figure.show()
输出图:
但是当前的解决方案是使用硬编码的填充值(0.15如果使用xticklabels,0.05否则),并且它不能很好地适应存在xlabels(参见子图 4)或改变图形大小。
有没有办法以编程方式计算出合适的填充值来放置颜色条?也许通过调整父轴对象的边界框,如果没有xlabelsor xticklabels,则它的 bbox 更小,或者通过找出父轴的坐标并以某种方式计算填充?


