2016-11-25 77 views
1

我已经有了颜色条的散点图,我保存为PNG图像。我需要情节是一定的figsize,但添加colorbar缩放原始情节。分别为散点图保存颜色条

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的设置如上)和彩作为两个单独的图像?

回答

3

显而易见的答案是“分开绘制颜色条”。您需要创建一个新的数字窗口并在那里绘制颜色条,以防止第一个数字被扭曲。小例子:

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 colorbardistorted with colorbarseparate colorbar with much whitecropped colorbar

首先是人物的已保存版本,而不到一个呼叫colormap。这很好,这是你想要保存的。第二张图显示如果我们拨打colorbar而没有任何额外的烦恼会发生什么:它需要原始图中的一些空间,这是你想要防止的。

您必须使用plt.subplots打开一个新图形(和轴),并使用原始图形的大小。通过这种方式,您可以确定生成的彩条将与原始图形中的彩条相同。在上面的设置中,我让matplotlib确定了颜色条本身的大小;但之后我们需要删除会污染结果图的辅助轴。 (另一个选择是手动创建一个单独的坐标轴,并带有预期的颜色条大小,我怀疑这不是一个可行的行为方式。)

现在,您可以在第三个绘图时,删除的轴之后留下的空白空间在结果图中清晰可见(但颜色条的大小相当完美)。您可以在后期制作中手动剪下此空白区域,或者使用可以自动剪切彩色条图像的东西。

我还包括一个版本的情节,其中matplotlib本身收获大部分数字:bbox_inches='tight'关键字参数savefig正是这样做的。好处在于,生成的图像文件只包含色条(如上图所示),但生成的色条大小与原始大小略有不同。根据您的特定需求,您需要尝试使用可用的方法来提供最适合您的解决方案。

+0

太棒了!谢谢!我用你最后一个例子。 我不明白的唯一的事情是为什么设置dpi和figsize给出了一些意想不到的大小的结果图像(我设置figsize =(3,8)和dpi = 80,但结果图是144x660像素而不是240x640像素) – AntonK

+1

@AntonK如果在调用'figure()'时设置'dpi = 80',则它只会影响屏幕上的输出。为了在输出文件中获得预期的dpi,您需要在调用'plt.savefig(“filename.png”,dpi = 80)'时设置'dpi = 80''。 (默认是100我认为)此外使用'bbox_inches ='tight''会改变figsize(这就是为什么你使用它,对吧?),所以你的输出图像尺寸是不可预知的。如果你需要一个特定的输出大小,你不应该调用'bbox_inches ='tight''。 – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest感谢您的输入,我完全不熟悉'dpi'设置。至于彩条,我相信这种调整大小对于OP来说是可以的:重要的是,情节本身具有给定的尺寸,然后可以在其旁边放置单独的彩条(否则,这个问题似乎没有意义至少对我来说)。在这种情况下,重要的是生成的颜色条对应于为图形绘制的内容,这就是为什么我建议从相同尺寸的图像开始(但是它确实被裁剪为自动设置的尺寸彩条)。 –