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

时间:2012-03-09 22:51:45

标签: 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")

我希望图像保持其宽高比并缩放到图形的大小......所以当我保存它时,它与输入图形完全相同,并且它完全由图像覆盖。

感谢。

3 个答案:

答案 0 :(得分:6)

我使用以下代码段完成了此操作。

#!/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'或您的比率来改变。

正如Zhenya在评论Similar StackOverflow Question中提到的那样 提到[{1}} savefigbbox_inches='tight'pad_inches=-1

ad_inches=0的参数

答案 1 :(得分:1)

您可以使用如下所示的功能。 它根据您想要的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()

答案 2 :(得分:-1)

这是一个最小的面向对象的解决方案:

fig = plt.figure(figsize=(8, 8))
ax = fig.add_axes([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调用之后。这是matplotlib's tight_layout functionality的重要部分,它被Jupyter渲染器之类的东西隐式调用。