Dans numpy/scipy, j'ai une image stockée dans un tableau. Je peux l'afficher, je veux l'enregistrer en utilisant savefig
sans 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
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.
Une solution plus simple semble être:
fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
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 .
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
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)
Celui-ci fonctionne pour moi
plt.savefig('filename',bbox_inches='tight',transparent=True, pad_inches=0)
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()
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')
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)
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()