Matplotlib: stretch image to cover whole figure

I'm quite used to working with Matlab and am now trying to do shift matplotlib and numpy. Is there a way in matplotlib that the image you are drawing occupies the entire figure window.

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")

      

I want the image to keep the aspect ratio and scale to the size of the shape ... so when I do the savefig it is the same size as the input image and is completely covered by the image.

Thank.

+3


source to share


2 answers


I did it using the following snippet.

#!/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()

      



Note that the gray border on the sides is related to the rario aspect of the axes, which is modified by setting aspect='equal'

or aspect='auto'

or your ratio.

Also as Zhenya mentioned in the comments fooobar.com/questions/53985 / ... mentions the parameters savefig

bbox_inches='tight'

and pad_inches=-1

or pad_inches=0

+6


source


You can use a function like the one below. It calculates the required size for the shape (in inches) according to the dpi you want.



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()

      

+1


source







All Articles