显然的答案是“单独绘制色条”。您需要创建一个新的图形窗口,并在其中绘制您的色条,以防止第一个图形变形。以下是一个小例子:
import matplotlib.pyplot as plt
import numpy as np
X,Y = np.mgrid[-2:3,-2:3]
Z = np.random.rand(*X.shape)
FIGSIZE = (2,3)
plt.figure(figsize=FIGSIZE)
mpb = plt.pcolormesh(X,Y,Z,cmap='viridis')
plt.savefig('plot_nocbar.png')
plt.colorbar()
plt.savefig('plot_withcbar.png')
fig,ax = plt.subplots(figsize=FIGSIZE)
plt.colorbar(mpb,ax=ax)
ax.remove()
plt.savefig('plot_onlycbar.png')
plt.savefig('plot_onlycbar_tight.png',bbox_inches='tight')
请查看以下四个图表(点击以查看完整版):
![cropped colorbar](https://istack.dev59.com/SzVS2t.webp)
第一个图是没有调用
colormap
的保存版本。这是可以的,这就是你想要保留的。第二个图展示了如果我们不做任何额外的操作调用
colorbar
会发生什么:它会从原始图中占用一些空间,这是你想要避免的。你需要使用
plt.subplots
打开一个新的图(和坐标轴),大小与原始图相同。这样你就可以确保产生的色条与在原始图中绘制的大小相同。在上述设置中,我让
matplotlib
自己确定颜色条的大小;但之后我们需要删除污染结果图的辅助坐标轴。(另一种选择是手动在新图中创建一个坐标轴,其颜色条的期望大小。我怀疑这不是可行的做法。)现在,正如你在第三张图中看到的那样,在删除的坐标轴留下的空白空间在结果图中明显可见(但颜色条的大小是完美的)。你可以在后期手动剪切掉这个白色空间,或者使用一些自动裁剪你的颜色条图像的工具。
我还包括了一个版本的图表,其中 matplotlib 自己裁剪了大部分的图形:使用
bbox_inches='tight'
关键字参数调用
savefig
可以实现这一点。优点是生成的图像文件仅包含色条(如上面第四幅图所示),但生成的色条大小将与您的原始色条略有不同。根据您的具体需求,您需要尝试可用的方法,找到最方便的解决方案。
figure()
时设置了dpi=80
,它只会影响屏幕上的输出。为了在输出文件中获得预期的 dpi,你需要在调用plt.savefig("filename.png", dpi=80)
时设置dpi=80
(默认值是100)。此外,使用bbox_inches='tight'
将改变 figsize(这就是你使用它的原因,对吧?),因此你的输出图像大小是不可预测的。如果你需要特定的输出大小,就不应该调用bbox_inches='tight'
。 - ImportanceOfBeingErnest