设置Matplotlib颜色条大小匹配图

我不能得到像这样的imshow图表上的颜色条与graphics相同的高度,事实之后使用Photoshop不足。 我如何获得高度匹配? 颜色条大小不匹配的示例

您可以使用matplotlib AxisDivider轻松完成此操作 。

链接页面的示例也可以不使用子图:

 import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locatable import numpy as np plt.figure() ax = plt.gca() im = ax.imshow(np.arange(100).reshape((10,10))) # create an axes on the right side of ax. The width of cax will be 5% # of ax and the padding between cax and ax will be fixed at 0.05 inch. divider = make_axes_locatable(ax) cax = divider.append_axes("right", size="5%", pad=0.05) plt.colorbar(im, cax=cax) 

在这里输入图像说明

这种组合(以及这些值附近的值)似乎“神奇地”对我来说保持色标缩放到情节,无论显示的尺寸是多less。

 plt.colorbar(im,fraction=0.046, pad=0.04) 

它也不需要共享可以得到不正方形的轴。

@ bogatron已经给出了matplotlib文档所提供的答案,它产生了正确的高度,但它引入了一个不同的问题。 现在,彩条的宽度(以及彩条和图之间的间距)随着图的宽度而变化。 换句话说,彩条的宽高比不再是固定的。

为了获得正确的高度给定的高宽比,你必须深入一些神秘的axes_grid1模块。

 import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locatable, axes_size import numpy as np aspect = 20 pad_fraction = 0.5 ax = plt.gca() im = ax.imshow(np.arange(200).reshape((20, 10))) divider = make_axes_locatable(ax) width = axes_size.AxesY(ax, aspect=1./aspect) pad = axes_size.Fraction(pad_fraction, width) cax = divider.append_axes("right", size=width, pad=pad) plt.colorbar(im, cax=cax) 

请注意,这指定了彩色条的宽度与图的高度 (与之前的图相反)。

现在可以将彩条和图之间的间距指定为彩条宽度的一小部分,这是IMHO比数字宽度的一小部分更有意义的数字。

彩条的图像绘图

更新:

我在这个主题上创build了一个IPython笔记本 ,在那里我将上面的代码打包成一个易于重用的函数:

 import matplotlib.pyplot as plt from mpl_toolkits import axes_grid1 def add_colorbar(im, aspect=20, pad_fraction=0.5, **kwargs): """Add a vertical color bar to an image plot.""" divider = axes_grid1.make_axes_locatable(im.axes) width = axes_grid1.axes_size.AxesY(im.axes, aspect=1./aspect) pad = axes_grid1.axes_size.Fraction(pad_fraction, width) current_ax = plt.gca() cax = divider.append_axes("right", size=width, pad=pad) plt.sca(current_ax) return im.axes.figure.colorbar(im, cax=cax, **kwargs) 

它可以像这样使用:

 im = plt.imshow(np.arange(200).reshape((20, 10))) add_colorbar(im) 

当您创buildcolorbar尝试使用分数和/或缩小参数。

从文件:

分数0.15; 用于颜色条的原始轴的分数

缩小1.0; 缩小色条的分数

上述所有的解决scheme都很好,但是我喜欢@史蒂夫和@贝多塔是最好的,因为他们不涉及花哨的电话,而且是普遍的。

通用我的意思是适用于任何types的轴,包括GeoAxes 。 例如,它已经投影了轴的映射:

 projection = cartopy.crs.UTM(zone='17N') ax = plt.axes(projection=projection) im = ax.imshow(np.arange(200).reshape((20, 10))) 

打电话给

 cax = divider.append_axes("right", size=width, pad=pad) 

将失败KeyException: map_projection

因此,用所有types的轴处理彩条大小的唯一通用方法是:

 ax.colorbar(im, fraction=0.046, pad=0.04) 

使用从0.035到0.046的分数来获得最佳尺寸。 然而,分数和paddig的值将需要调整,以得到最适合您的情节,并将取决于如果彩条的方向是垂直位置或水平。