J'ai besoin de prendre une image et de la sauvegarder après un certain processus. La figure semble correcte lorsque je l'affiche, mais après avoir sauvegardé la figure, j'ai obtenu un espace blanc autour de l'image enregistrée. J'ai essayé l' 'tight'
option savefig
méthode, cela n'a pas fonctionné non plus. Le code:
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
fig = plt.figure(1)
img = mpimg.imread(path)
plt.imshow(img)
ax=fig.add_subplot(1,1,1)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches=extent)
plt.axis('off')
plt.show()
J'essaie de dessiner un graphique de base en utilisant NetworkX sur une figure et de l'enregistrer. Je me suis rendu compte que sans graphique, cela fonctionne, mais lors de l'ajout d'un graphique, j'obtiens un espace blanc autour de l'image enregistrée;
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import networkx as nx
G = nx.Graph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edge(1,3)
G.add_edge(1,2)
pos = {1:[100,120], 2:[200,300], 3:[50,75]}
fig = plt.figure(1)
img = mpimg.imread("C:\\images\\1.jpg")
plt.imshow(img)
ax=fig.add_subplot(1,1,1)
nx.draw(G, pos=pos)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches = extent)
plt.axis('off')
plt.show()
python
matplotlib
Ahmet Tuğrul Bayrak
la source
la source
Réponses:
Je ne peux pas prétendre savoir exactement pourquoi ou comment ma «solution» fonctionne, mais c'est ce que j'ai dû faire lorsque je voulais tracer le contour de quelques sections de voilure - sans marges blanches - dans un fichier PDF. (Notez que j'ai utilisé matplotlib dans un notebook IPython, avec l'indicateur -pylab.)
J'ai essayé de désactiver différentes parties de ceci, mais cela conduit toujours à une marge blanche quelque part. Vous pouvez même avoir modifié cela pour empêcher les lignes grasses proches des limites de la figure d'être rasées par le manque de marges.
la source
set_major_locator
étaient nécessaires.pad_inches=0
que les autres réponses ne mentionnent pas.set_major_locator
était la clé pour moi.pad_inches
m'a aidé.Vous pouvez supprimer le remplissage des espaces blancs en définissant
bbox_inches="tight"
danssavefig
:Vous devrez mettre l'argument
bbox_inches
sous forme de chaîne, c'est peut-être pour cette raison que cela n'a pas fonctionné plus tôt pour vous.Doublons possibles:
Graphiques Matplotlib: suppression des axes, des légendes et des espaces blancs
Comment définir les marges d'une figure matplotlib?
Réduisez les marges gauche et droite dans le tracé matplotlib
la source
fig.savefig()
. (plt.savefig()
ne fonctionnera pas dans ce cas.)bbox_inches
option, il existe une autre valeur par défaut qui laisse un peu d'espace. Si vous voulez vraiment vous débarrasser de tout, vous devez également utiliserpad_inches=0.0
. Bien sûr, un rembourrage aussi serré coupe fréquemment, par exemple, les exposants ...pad_inches=-0.1
Après avoir essayé les réponses ci-dessus sans succès (et une multitude d'autres messages de pile), ce qui a finalement fonctionné pour moi était juste
Il est important de noter que cela n'inclut pas les arguments bbox ou padding.
la source
set_axis_off
. Cela n'affecte pas l'image enregistrée car une fois quesubplots_adjust
l'axe se trouve en dehors de l'étendue de la figure et que henve ne sera de toute façon pas tracé. Dans les blocs-notes Jupyter, cependant, vous devez désactiver explicitement l'axe, car le backend en ligne écrase ces paramètres.J'ai trouvé quelque chose d'Arvind Pereira ( http://robotics.usc.edu/~ampereir/wordpress/?p=626 ) et j'ai semblé fonctionner pour moi:
la source
transparent=True
donnera l'impression qu'il n'y a pas de problème, mais cela masquera simplement l'espace blanc, les dimensions de l'image ne seront pas correctes.pad_inches
! J'aurais aimé connaître cette option plus tôt!pad_inches=.25
La fonction suivante incorpore la réponse de johannes ci-dessus. Je l'ai testé avec
plt.figure
etplt.subplots()
avec plusieurs axes, et cela fonctionne bien.la source
J'ai trouvé que les codes suivants fonctionnent parfaitement pour le travail.
la source
J'ai suivi cette séquence et cela a fonctionné comme un charme.
la source
Pour tous ceux qui souhaitent travailler en pixels plutôt qu'en pouces, cela fonctionnera.
De plus, vous aurez également besoin de l'habituel
Ensuite, vous pouvez utiliser ce qui suit:
la source
fig.dpi
placeUne approche beaucoup plus simple que j'ai trouvée consiste à utiliser
plt.imsave
:la source
plt.savefig()
.Vous pouvez essayer ceci. Cela a résolu mon problème.
la source
Cela a fonctionné pour moi
plt.savefig(save_path,bbox_inches='tight', pad_inches=0, transparent=True)
la source
Si vous souhaitez afficher ce qui doit être enregistré, je vous recommande d'utiliser la
plt.tight_layout
transformation qui est en fait plus préférable car elle ne fait pas de recadrage inutile lors de l'utilisationplt.savefig
la source
Cela fonctionne pour moi en enregistrant un tableau numpy tracé avec imshow to file
la source