Je dois prendre une image et la sauvegarder après un processus. La figure a l'air bien quand je l'affiche, mais lorsque je l'ai sauvegardée, j'ai laissé un espace blanc autour de l'image enregistrée. J'ai essayé l'option 'tight'
pour la méthode savefig
, ne fonctionnait pas 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 quand un graphique est ajouté, j'obtiens des espaces blancs 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()
Je ne peux pas prétendre savoir exactement pourquoi ni comment ma "solution" fonctionne, mais c'est ce que je devais faire lorsque je voulais tracer le contour de quelques sections de profilés - sans marges blanches - dans un fichier PDF. (Notez que j’ai utilisé matplotlib dans un cahier IPython, avec le drapeau -pylab.)
gca().set_axis_off()
subplots_adjust(top = 1, bottom = 0, right = 1, left = 0,
hspace = 0, wspace = 0)
margins(0,0)
gca().xaxis.set_major_locator(NullLocator())
gca().yaxis.set_major_locator(NullLocator())
savefig("filename.pdf", bbox_inches = 'tight',
pad_inches = 0)
J'ai essayé de désactiver différentes parties de ceci, mais cela a toujours conduit à une marge blanche quelque part. Vous pouvez même avoir modifié ceci pour que les lignes grasses proches des limites de la figure ne soient pas rasées par le manque de marges.
Vous pouvez supprimer le remplissage d'espaces en définissant bbox_inches="tight"
dans savefig
:
plt.savefig("test.png",bbox_inches='tight')
Vous devrez mettre l'argument à bbox_inches
sous forme de chaîne. C'est peut-être pour cela que cela n'a pas fonctionné plus tôt pour vous.
Doubles possibles:
Parcelles Matplotlib: suppression des axes, légendes et espaces blancs
J'ai trouvé quelque chose d'Arvind Pereira ( http://robotics.usc.edu/~ampereir/wordpress/?p=626 ) et a semblé fonctionner pour moi:
plt.savefig(filename, transparent = True, bbox_inches = 'tight', pad_inches = 0)
J'ai trouvé les codes suivants fonctionnent parfaitement pour le travail.
fig = plt.figure(figsize=[6,6])
ax = fig.add_subplot(111)
ax.imshow(data)
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
ax.set_frame_on(False)
plt.savefig('data.png', dpi=400, bbox_inches='tight',pad_inches=0)
Après avoir essayé les réponses ci-dessus sans succès (et une multitude d’autres publications de pile), ce qui a finalement fonctionné pour moi a été
plt.gca().set_axis_off()
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0,
hspace = 0, wspace = 0)
plt.margins(0,0)
plt.savefig("myfig.pdf")
Fait important, cela n'inclut pas les arguments bbox ou padding. Pour des raisons obscures, lorsque l'argument bbox a été inclus dans mon savefig, mon chiffre a été décalé vers le haut et le centre.
j'ai suivi cette séquence et cela a fonctionné comme un charme.
plt.axis ("off")
fig = plt.imshow (tableau d'images, interpolation = 'le plus proche')
fig.axes.get_xaxis (). set_visible (False)
fig.axes.get_yaxis (). set_visible (False)
plt.savefig ('destination_path.pdf', bbox_inches = 'tight', pad_inches = 0, format = 'pdf', dpi = 1200)
La fonction suivante incorpore la réponse de johannes-s ci-dessus. Je l'ai testé avec plt.figure
et plt.subplots()
avec plusieurs axes, et cela fonctionne bien.
def save(filepath, fig=None):
'''Save the current image with no whitespace
Example filepath: "myfig.png" or r"C:\myfig.pdf"
'''
import matplotlib.pyplot as plt
if not fig:
fig = plt.gcf()
plt.subplots_adjust(0,0,1,1,0,0)
for ax in fig.axes:
ax.axis('off')
ax.margins(0,0)
ax.xaxis.set_major_locator(plt.NullLocator())
ax.yaxis.set_major_locator(plt.NullLocator())
fig.savefig(filepath, pad_inches = 0, bbox_inches='tight')
Une approche beaucoup plus simple que j'ai trouvée consiste à utiliser plt.imsave
:
import matplotlib.pyplot as plt
arr = plt.imread(path)
plt.imsave('test.png', arr)