在Matplotlib中设置绘图画布的大小

Dar*_*rio 15 python plot graph matplotlib

我希望Matplotlib/Pyplot生成具有一致画布大小的图.也就是说,图形可以具有不同的尺寸以适应轴描述,但是绘图区域(绘制曲线的矩形)应该总是具有相同的尺寸.

有没有一种简单的方法来实现这一目标?pyplot.figure()的选项figsize似乎设置了图形的整体大小,而不是画布的大小,因此每当轴描述占用更多或更少的空间时,我会得到不同的画布大小.

Rut*_*ies 12

这是我对Matplotlib最大的挫折之一.我经常使用栅格数据,例如我想添加色彩图,图例和一些标题.matplotlib库中的任何简单示例都会导致不同的分辨率,从而导致重采样数据.特别是在进行图像分析时,您不需要任何(不需要的)重采样.

这是我通常做的,虽然我很想知道是否有更简单或更好的方法.

让我们从加载图片开始,然后以相同的分辨率输出图片:

import matplotlib.pyplot as plt
import urllib2

# load the image
img = plt.imread(urllib2.urlopen('http://upload.wikimedia.org/wikipedia/en/thumb/5/56/Matplotlib_logo.svg/500px-Matplotlib_logo.svg.png'))

# get the dimensions
ypixels, xpixels, bands = img.shape

# get the size in inches
dpi = 72.
xinch = xpixels / dpi
yinch = ypixels / dpi

# plot and save in the same size as the original
fig = plt.figure(figsize=(xinch,yinch))

ax = plt.axes([0., 0., 1., 1.], frameon=False, xticks=[],yticks=[])
ax.imshow(img, interpolation='none')

plt.savefig('D:\\mpl_logo.png', dpi=dpi, transparent=True)
Run Code Online (Sandbox Code Playgroud)

请注意,我手动定义了轴位置,以便跨越整个图形.

以与上面类似的方式,您可以在图像周围添加一些边距以允许标签或颜色条等.

此示例在图像上方添加20%的边距,然后用于绘制标题:

fig = plt.figure(figsize=(xinch,yinch/.8))

ax = plt.axes([0., 0., 1., .8], frameon=False, xticks=[],yticks=[])
ax.imshow(img, interpolation='none')
ax.set_title('Matplotlib is fun!', size=16, weight='bold')

plt.savefig('D:\\mpl_logo_with_title.png', dpi=dpi)
Run Code Online (Sandbox Code Playgroud)

因此,图形y尺寸(高度)增加,轴的y尺寸均匀减小.这样可以提供更大的(整体)输出图像,但轴区域的大小仍然相同.

拥有像.set_scale()这样的数字或轴属性以强制实现真正的1-on-x输出可能会很好.

  • 谢谢,你的建议奏效了!顺便说一句,我想我在调用figure()之后立即使用subplot_adjust(0,0,1,1)找到了一种更优雅的方式.然后,您不需要定义轴位置,因为它们已经与图形一样大.最后,如果您不想手动指定边距,可以使用参数bbox_inches ='tight'调用savefig().在这种情况下,绘图区域将完全由(xinch,yinch)定义,并且该图形将足够大以容纳轴描述.(正如tcaswell所指出的,不要使用tight_layout!) (3认同)