分别为散点图保存颜色条

时间:2016-11-25 22:52:43

标签: python matplotlib colorbar

我有彩色条的散点图,我保存为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作为两个单独的图像?

1 个答案:

答案 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')

考虑以下四个数字(点击查看正确):

no colorbar distorted with colorbar separate colorbar with much white cropped colorbar

第一个是图的保存版本,没有调用colormap。这很好,这是你想保留的。第二个图显示了如果我们在没有任何额外麻烦的情况下调用colorbar会发生什么:它会从原始图中占用一些空间,这就是你想要防止的。

您必须使用plt.subplots打开一个新的图形(和轴),其大小与原始图形相同。这样,您可以确保生成的颜色条与原始图形中绘制的颜色条相同。在上面的设置中,我让matplotlib确定颜色条本身的大小;但之后我们需要删除会污染结果图的辅助轴。 (另一种选择是手动创建新图中的单个轴,具有预期的颜色条大小。我怀疑这不是一个可行的做法。)

现在,正如您在第三个图中所看到的,在删除的轴之后留下的空白区域在结果图中清晰可见(但是相应地,颜色条的大小是完美的)。您可以在后期制作中手动剪切此空白区域,也可以使用自动裁剪色条图像的内容。

我还包括了一个版本的情节,其中matplotlib本身裁剪了大部分数字:bbox_inches='tight'的{​​{1}}关键字参数就是这样做的。好处是生成的图像文件只包含颜色条(如第四张图片中所示),但生成的颜色条的大小将与原始颜色略有不同。根据您的具体需求,您需要尝试使用可用的方法来提供最方便的解决方案。

相关问题