ÉDITER
Changé aspect='normal
en aspect='auto'
depuis que cela a changé dans les versions plus récentes de matplotlib (merci à @ Luke19).
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='auto')
fig.savefig(fname, dpi)
Le aspect
paramètre modifie la taille des pixels pour s'assurer qu'ils remplissent la taille de la figure spécifiée dans fig.set_size_inches(…)
. Pour avoir une idée de la façon de jouer avec ce genre de choses, lisez la documentation de matplotlib , en particulier sur le thème Axes, Axis et Artist.
w
eth
dansfig.set_size_inches(w,h)
et ledpi
paramètre dans defig.savefig(fname, dpi)
sorte qu'il en résulte 24px par 24px, cela devrait fonctionner correctement. Par exemple,w = h = 1
etdpi = 24
imshow
la syntaxe de a changé àaspect='auto'
au lieu de'normal'
).ax = plt.Axes(fig, [0., 0., 1., 1.])
est ce qui le fait fonctionner.Une solution plus simple semble être:
fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
la source
fig.savefig('out.png', bbox_inches='tight',transparent=True, pad_inches=0)
Vous pouvez trouver la bbox de l'image à l'intérieur de l'axe (en utilisant
get_window_extent
), et utiliser lebbox_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 .
la source
plt.axis('off')
aidé. Les autres réponses n'aident pas beaucoup.plt.savefig('/temp/test.png', bbox_inches='tight', transparent=True, pad_inches=0)
place deplt.savefig('/tmp/test.png', bbox_inches=extent)
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
la source
Je vais suggérer une réponse à heron13 avec un léger ajout emprunté à ici pour supprimer le rembourrage laissé après avoir mis 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)
la source
Celui-ci fonctionne pour moi
plt.savefig('filename',bbox_inches='tight',transparent=True, pad_inches=0)
la source
J'ai eu le même problème en faisant de la visualisation à l'aide de librosa où je voulais extraire le contenu de l'intrigue sans aucune autre information. Voilà donc mon approche. Unutbu answer m'aide aussi à me mettre au travail.
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()
la source
extent.get_points()*np.array([[1.1],[.9]])
.Pour quiconque essaie de faire cela dans Jupyter
plt.axis('off') spec = plt.imshow plt.savefig('spec',bbox_inches='tight',transparent=True, pad_inches=0)
la source
Bien que les réponses ci-dessus traitent de la suppression des marges et du remplissage, elles n'ont pas fonctionné pour moi pour supprimer les étiquettes. Voici ce qui a fonctionné, pour quiconque tombe sur cette question plus tard:
En supposant que vous vouliez une grille 2x2 de sous-graphiques à 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')
la source
J'ai essayé de me débarrasser de la frontière aussi, en utilisant des conseils ici, mais rien n'a vraiment fonctionné. Certains bidouillages et j'ai trouvé que changer la couleur du visage ne me donnait pas de 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()
la source
En fait, j'ai essayé cela récemment et au lieu de toutes ces lignes, vous pouvez utiliser
Fonctionne comme un charme. juste une ligne et le problème est résolu.
Documentation ( https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.imsave.html )
la source
Pour moi, ce code a rendu similaire la taille de l'image d'entrée sans cadre et axes des codes matehat , unutbu et WHZW :
fig = plt.figure() ax = fig.add_subplot(1,1,1) plt.axis('off') viridis = cm.get_cmap('gist_gray', 256) plt.imshow(data, aspect='auto', cmap=viridis) plt.tight_layout() plt.savefig(out_file, bbox_inches='tight', transparent=True, pad_inches=0)
Environnement d'exécution:
Python 3.6.10
Matplotlib 3.2.1
OS Windows 10
la source