web-dev-qa-db-fra.com

scipy: savefig sans cadres, axes, uniquement le contenu

Dans numpy/scipy, j'ai une image stockée dans un tableau. Je peux l'afficher, je veux l'enregistrer en utilisant savefigsans toutes les bordures, axes, étiquettes, titres, ... Juste une image pure, rien d'autre.

Je veux éviter les packages comme PyPNG ou scipy.misc.imsave, Ils sont parfois problématiques (ils ne s'installent pas toujours bien, seulement de base savefig() pour moi

66
Jakub M.

En supposant :

import matplotlib.pyplot as plt

Pour faire une figure sans le cadre:

fig = plt.figure(frameon=False)
fig.set_size_inches(w,h)

Pour que le contenu remplisse toute la figure

ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)

Dessinez ensuite votre image dessus:

ax.imshow(your_image, aspect='normal')
fig.savefig(fname, dpi)

Le paramètre aspect modifie la taille des pixels pour s'assurer qu'ils remplissent la taille de chiffre spécifiée dans fig.set_size_inches(…). Pour avoir une idée de comment jouer avec ce genre de choses, lisez documentation de matplotlib , en particulier sur le sujet d'Axes, Axis et Artist.

89
matehat

Une solution plus simple semble être:

fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
55
weatherfrog

Vous pouvez trouver la bbox de l'image à l'intérieur de l'axe (en utilisant get_window_extent) et utilisez le bbox_inches paramètre pour enregistrer uniquement cette partie de l'image:

import numpy as np
import matplotlib.pyplot as plt

data=np.arange(9).reshape((3,3))
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
plt.axis('off')
plt.imshow(data)

extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('/tmp/test.png', bbox_inches=extent)

J'ai appris cette astuce de Joe Kington ici .

24
unutbu

J'ai essayé plusieurs options dans mon cas, et la meilleure solution était la suivante:

fig.subplots_adjust(bottom = 0)
fig.subplots_adjust(top = 1)
fig.subplots_adjust(right = 1)
fig.subplots_adjust(left = 0)

puis enregistrez votre silhouette avec savefig

15
Cagri Sarigoz

Je proposerai la réponse de heron13 avec un léger ajout emprunté à ici pour supprimer le rembourrage laissé après avoir réglé la bbox en mode serré, donc:

axes = fig.axes()
axes.get_xaxis().set_visible(False)
axes.get_yaxis().set_visible(False)
fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
8
Mostafa Pakparvar

Celui-ci fonctionne pour moi

plt.savefig('filename',bbox_inches='tight',transparent=True, pad_inches=0)
4
Cathy Yang

J'ai eu le même problème en faisant une visualisation en utilisant librosa où je voulais extraire le contenu de l'intrigue sans aucune autre information. Voilà donc mon approche. la réponse unutbu m'aide aussi à travailler.

    figure = plt.figure(figsize=(500, 600), dpi=1)
    axis = plt.subplot(1, 1, 1)
    plt.axis('off')
    plt.tick_params(axis='both', left='off', top='off', right='off', bottom='off', labelleft='off', labeltop='off',
                    labelright='off', labelbottom='off')

     # your code goes here. e.g: I used librosa function to draw a image
    result = np.array(clip.feature_list['fft'].get_logamplitude()[0:2])
    librosa.display.specshow(result, sr=api.Clip.RATE, x_axis='time', y_axis='mel', cmap='RdBu_r')


    extent = axis.get_window_extent().transformed(figure.dpi_scale_trans.inverted())
    plt.savefig((clip.filename + str("_.jpg")), format='jpg', bbox_inches=extent, pad_inches=0)
    plt.close()
3
GPrathap

Bien que les réponses ci-dessus concernent la suppression des marges et du remplissage, elles n'ont pas fonctionné pour moi dans la suppression des étiquettes. Voici ce qui a fonctionné, pour quiconque tombe sur cette question plus tard:

En supposant que vous vouliez une grille 2x2 de sous-tracés à partir de quatre images stockées dans images:

matplotlib.pyplot.figure(figsize = (16,12)) # or whatever image size you require
for i in range(4):
    ax = matplotlib.pyplot.subplot(2,2,i+1)
    ax.axis('off')
    imshow(images[i])
matplotlib.pyplot.savefig(path, bbox_inches='tight')
2
curious

Pour quiconque essaie de le faire dans Jupyter

 plt.axis('off')

 spec = plt.imshow

 plt.savefig('spec',bbox_inches='tight',transparent=True, pad_inches=0)
1
Krackle

J'ai aussi essayé de me débarrasser de la frontière, en utilisant des conseils, mais rien n'a vraiment fonctionné. Certains tripotaient et j'ai trouvé que changer la couleur du visage ne me donnait aucune bordure dans les laboratoires jupyter (toute couleur entraînait la suppression de la bordure blanche). J'espère que cela t'aides.

def show_num(data):
data = np.rot90(data.reshape((16,16)), k=3)
data = np.fliplr(data)
fig = plt.figure(frameon=False, facecolor='white')
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
ax.imshow(data)
plt.show()

enter image description here

0
Atom Scott