Python 在Matplotlib中设置打印画布的大小

Python 在Matplotlib中设置打印画布的大小,python,graph,matplotlib,plot,Python,Graph,Matplotlib,Plot,我希望Matplotlib/Pyplot生成画布大小一致的绘图。也就是说,图形可以有不同的大小以适应轴的描述,但是绘图区域(绘制曲线的矩形)应该始终具有相同的大小 有没有一个简单的方法来实现这一点?pyplot.figure()的figsize选项似乎设置了图形的整体大小,而不是画布的大小,因此每当轴描述占用更多或更少的空间时,我都会得到不同的画布大小。这是我对Matplotlib最大的挫折之一。我经常使用光栅数据,例如,我想添加彩色地图、图例和一些标题。matplotlib库中的任何简单示例都

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


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

这是我对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)
请注意,我手动定义了轴的位置,以便跨越整个图形

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

此示例在图像上方添加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)
因此,图形y尺寸(高度)增加,轴的y尺寸相等地减小。这将提供更大的(整体)输出图像,但轴区域的大小仍然相同


最好使用像.set_scale()这样的figure或axes属性来强制执行真正的1对x输出

可以在Matplotlib rc中指定以下设置:

import matplotlib
matplotlib.rcParams['figure.figsize'] = [10, 10] # for square canvas
matplotlib.rcParams['figure.subplot.left'] = 0
matplotlib.rcParams['figure.subplot.bottom'] = 0
matplotlib.rcParams['figure.subplot.right'] = 1
matplotlib.rcParams['figure.subplot.top'] = 1

gridspec
可能允许您控制所需内容(参见最后3条)。您能添加一些示例来显示导致问题的不同轴描述吗?这是MPL对要绘制的内容和如何绘制的描述进行解耦的方式的代价。可以肯定的是,手工操作,并刻意避免紧凑的布局,是最好的方法。你能改用矢量格式吗?它应该(我认为)把每个像素画成一个矩形。或者刚好超过样品。谢谢你,你的建议奏效了!顺便说一句,我想我确实找到了一种更优雅的方法,在调用figure()之后立即使用subplot_adjust(0,0,1,1)。然后,不需要定义轴的位置,因为它们已经和图形一样大了。最后,如果不想手动指定边距,可以使用参数bbox_inches='tight'调用savefig()。在这种情况下,绘图区域将完全符合(xinch,yinch)的定义,并且图形将足够大以容纳轴描述。(正如tcaswell所指出的,不要使用紧凑的布局!)这听起来确实更容易,谢谢你的提示。我以后再试试你的建议@tcaswell,谢谢,这在某些情况下可能会起作用,我认为pcolor应该能够很容易地做到这一点。不过,任何其他后处理都会更加困难。@Dario如果这样做,那么您就已经将所有轴标签都推掉了。如果您正在制作光栅图像,那么使用PIL保存图像可能会更好。@tcaswell会将标签推离,但如果调用savefig(bbox_inches='tight'),则可以将其取回。还是我没有领会你的意思?