Ant*_*onK 2 python matplotlib colorbar
我有带有colorbar的散点图,我将其另存为PNG图像。我需要该图具有一定的figsize,但要添加颜色条缩放原始图。
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)
Run Code Online (Sandbox Code Playgroud)
如何将原始图(按上述设置figsize)和颜色栏保存为两个单独的图像?
显而易见的答案是“分别绘制颜色栏”。您需要创建一个新的图形窗口并在其中绘制颜色栏,以防止您的第一个图形变形。小例子:
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')
Run Code Online (Sandbox Code Playgroud)
考虑生成的以下四个图(单击以正确查看):
第一个是该图的保存版本,未调用colormap。很好,这就是您要保留的内容。第二个图显示了如果我们在调用时colorbar没有大惊小怪的话会发生什么:它要比原始图占用一些空间,这就是您要防止的。
您必须使用plt.subplots并以原始图形的大小打开一个新图形(和轴)。这样,您可以确保产生的颜色条的大小与原始图形中绘制的颜色条相同。在上面的设置中,我matplotlib确定颜色条本身的大小。但是之后,我们需要删除会污染结果图的辅助轴。(另一种选择是在新图中手动创建单个轴,并使用颜色条的预期大小。我怀疑这不是可行的操作。)
现在,如您在第三幅图中看到的那样,在结果图中可以清楚地看到在删除的轴之后留下的空白区域(但相应地,颜色栏的大小是完美的)。您可以在后期制作中手动切断此空白区域,也可以使用可以自动裁剪彩条图像的内容。
我还提供了该图的一个版本,其中matplotlib本身可以裁剪掉大部分图形:bbox_inches='tight'to 的关键字参数savefig正是这样做的。有利的是,生成的图像文件仅包含颜色条(如上面的第四幅图像所示),但是生成的颜色条的大小将与原始颜色条略有不同。根据您的特定需求,您将需要尝试可用的方法来提出最适合您的解决方案。