我有彩色条的散点图,我保存为PNG图像。我需要绘制某个figsize但是添加colorbar scale原始绘图。
import pylab as plt
plt.figure(figsize=FIGSIZE)
plt.scatter(X, Y, c=Z, s=marker_size, norm=LogNorm(), vmin=VMIN, vmax=VMAX, cmap=CMAP,rasterized=True,lw=0,)
CB = plt.colorbar(ticks=TICKS, format=FORMAT)
我怎样才能保存原始图(如上图所示的figsize)和colorbar作为两个单独的图像?
答案 0 :(得分:5)
显而易见的答案是“单独绘制颜色条”。您需要创建一个新的图形窗口并在那里绘制颜色条,以防止您的第一个图形被扭曲。小例子:
import matplotlib.pyplot as plt
import numpy as np # only for dummy data
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')
# plot the original without a colorbar
plt.savefig('plot_nocbar.png')
# plot a colorbar into the original to see distortion
plt.colorbar()
plt.savefig('plot_withcbar.png')
# draw a new figure and replot the colorbar there
fig,ax = plt.subplots(figsize=FIGSIZE)
plt.colorbar(mpb,ax=ax)
ax.remove()
plt.savefig('plot_onlycbar.png')
# save the same figure with some approximate autocropping
plt.savefig('plot_onlycbar_tight.png',bbox_inches='tight')
考虑以下四个数字(点击查看正确):
第一个是图的保存版本,没有调用colormap
。这很好,这是你想保留的。第二个图显示了如果我们在没有任何额外麻烦的情况下调用colorbar
会发生什么:它会从原始图中占用一些空间,这就是你想要防止的。
您必须使用plt.subplots
打开一个新的图形(和轴),其大小与原始图形相同。这样,您可以确保生成的颜色条与原始图形中绘制的颜色条相同。在上面的设置中,我让matplotlib
确定颜色条本身的大小;但之后我们需要删除会污染结果图的辅助轴。 (另一种选择是手动创建新图中的单个轴,具有预期的颜色条大小。我怀疑这不是一个可行的做法。)
现在,正如您在第三个图中所看到的,在删除的轴之后留下的空白区域在结果图中清晰可见(但是相应地,颜色条的大小是完美的)。您可以在后期制作中手动剪切此空白区域,也可以使用自动裁剪色条图像的内容。
我还包括了一个版本的情节,其中matplotlib本身裁剪了大部分数字:bbox_inches='tight'
的{{1}}关键字参数就是这样做的。好处是生成的图像文件只包含颜色条(如第四张图片中所示),但生成的颜色条的大小将与原始颜色略有不同。根据您的具体需求,您需要尝试使用可用的方法来提供最方便的解决方案。