matplotlib:拉伸图像以覆盖整个图形

matplotlib:拉伸图像以覆盖整个图形,matplotlib,figure,Matplotlib,Figure,我非常习惯于使用matlab,现在尝试转换matplotlib和numpy。matplotlib中是否有一种方法可以使正在绘制的图像占据整个地物窗口 import numpy as np import matplotlib.pyplot as plt # get image im as nparray # ........ plt.figure() plt.imshow(im) plt.set_cmap('hot') plt.savefig("frame.png") 我希望图像保持它的纵

我非常习惯于使用matlab,现在尝试转换matplotlib和numpy。matplotlib中是否有一种方法可以使正在绘制的图像占据整个地物窗口

import numpy as np
import matplotlib.pyplot as plt

# get image im as nparray
# ........

plt.figure()
plt.imshow(im)
plt.set_cmap('hot')

plt.savefig("frame.png")
我希望图像保持它的纵横比和比例,以数字的大小。。。因此,当我保存它时,它的大小与输入的图形完全相同,并且完全被图像覆盖


谢谢。

您可以使用下面的函数。 它根据所需的dpi分辨率计算图形所需的大小(以英寸为单位)

import numpy as np
import matplotlib.pyplot as plt

def plot_im(image, dpi=80):
    px,py = im.shape # depending of your matplotlib.rc you may 
                              have to use py,px instead
    #px,py = im[:,:,0].shape # if image has a (x,y,z) shape 
    size = (py/np.float(dpi), px/np.float(dpi)) # note the np.float()

    fig = plt.figure(figsize=size, dpi=dpi)
    ax = fig.add_axes([0, 0, 1, 1])
    # Customize the axis
    # remove top and right spines
    ax.spines['right'].set_color('none')
    ax.spines['left'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.spines['bottom'].set_color('none')
    # turn off ticks
    ax.xaxis.set_ticks_position('none')
    ax.yaxis.set_ticks_position('none')
    ax.xaxis.set_ticklabels([])
    ax.yaxis.set_ticklabels([])

    ax.imshow(im)
    plt.show()

我使用以下代码片段完成了这项工作

#!/usr/bin/env python
import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
from pylab import *

delta = 0.025
x = y = np.arange(-3.0, 3.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = Z2-Z1  # difference of Gaussians
ax = Axes(plt.gcf(),[0,0,1,1],yticks=[],xticks=[],frame_on=False)
plt.gcf().delaxes(plt.gca())
plt.gcf().add_axes(ax)
im = plt.imshow(Z, cmap=cm.gray)

plt.show()
注意:侧面的灰色边框与轴的纵横比有关,可通过设置
aspect='equal'
aspect='auto'
或您的比率进行更改

也如振亚在评论中提到的
提到了
bbox\u inches='tight'
pad\u inches=-1
或p
ad\u inches=0
savefig
的参数,这里有一个最小的面向对象解决方案:

fig=plt.figure(figsize=(8,8))
ax=fig.add_轴([0,0,1,1],frameon=False,xticks=[],yticks=[]))
用计算机测试它

ax.imshow([[0]])
fig.savefig('test.png')
保存一个统一的紫色块

编辑:正如@duhaime在下面指出的,这要求图形具有与轴相同的外观

如果要根据图形调整轴的大小,请将
aspect='auto'
添加到
imshow

如果要将地物调整大小以调整到轴的大小,请添加

from matplotlib import tight_bbox
bbox = fig.get_tightbbox(fig.canvas.get_renderer())
tight_bbox.adjust_bbox(fig, bbox, fig.canvas.fixed_dpi) 

imshow
调用之后。这是Jupyter的渲染器之类的东西隐式调用的重要部分。

看看这一点:这些答案都没有填满整个数字,但这里的答案是:加上一个用于
bbox\u inches='tight'
,这真正回答了这个问题。这只适用于方形图像。尝试
figsize=(2,8)
添加了一个修复程序。