web-dev-qa-db-fra.com

Suppression des espaces autour d'une image enregistrée dans matplotlib

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()
88

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.

84
Johannes S.

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

Comment définir les marges pour une figure matplotlib?

Réduit les marges gauche et droite dans le tracé matplotlib

129
Hooked

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)
10
unclerico

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)
6
Richard Yu Liu

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.

2
SuaveSouris

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)

0
Khan

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')
0
TomNorway

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)
0
Parth92