it-swarm.com.de

Entfernen von Leerzeichen um ein gespeichertes Bild in Matplotlib

Ich muss ein Bild aufnehmen und nach einem bestimmten Vorgang speichern. Die Figur sieht gut aus, wenn ich sie zeige, aber wenn ich die Figur rette, habe ich etwas Leerzeichen um das gespeicherte Bild herum. Ich habe die 'tight'-Option für die savefig-Methode ausprobiert, aber auch nicht funktioniert. Der 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()

Ich versuche, mit NetworkX eine grundlegende Grafik zu zeichnen und zu speichern. Ich habe erkannt, dass es ohne Grafik funktioniert, aber wenn ich eine Grafik hinzufüge, bekomme ich Leerzeichen um das gespeicherte Bild.

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

Ich kann nicht behaupten, dass ich genau weiß, warum oder wie meine „Lösung“ funktioniert. Dies war jedoch der Fall, als ich die Umrisse einiger Tragflächenabschnitte ohne weiße Ränder in eine PDF -Datei zeichnen wollte. (Beachten Sie, dass ich Matplotlib in einem IPython-Notebook mit der Markierung -pylab verwendet habe.)

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)

Ich habe versucht, verschiedene Teile davon zu deaktivieren, aber dies führt immer irgendwo zu einem weißen Rand. Möglicherweise müssen Sie dies sogar ändern, um zu verhindern, dass sich dicke Linien in der Nähe der Grenzen der Figur durch den Mangel an Rändern rasieren.

84
Johannes S.

Sie können die Leerraumauffüllung entfernen, indem Sie bbox_inches="tight" in savefig einstellen:

plt.savefig("test.png",bbox_inches='tight')

Sie müssen das Argument als String in bbox_inches setzen. Vielleicht hat es deshalb für Sie nicht funktioniert.


Mögliche Duplikate:

Matplotlib-Diagramme: Entfernen von Achsen, Legenden und Leerzeichen

Wie lege ich die Margen für eine Matplotlib-Figur fest?

Linke und rechte Ränder in Matplotlib-Plot reduzieren

129
Hooked

Ich habe etwas von Arvind Pereira gefunden ( http://robotics.usc.edu/~ampereir/wordpress/?p=626 ) und schien für mich zu funktionieren:

plt.savefig(filename, transparent = True, bbox_inches = 'tight', pad_inches = 0)
10
unclerico

Ich fand die folgenden Codes perfekt für den Job.

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

Nachdem ich die obigen Antworten ohne Erfolg (und mit einer Menge anderer Stack-Posts) ausprobiert hatte, war das, was schließlich für mich funktionierte, einfach

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")

Wichtig ist, dass dies nicht die Argumente "bbox" oder "padding" beinhaltet. Aus unklaren Gründen wurde meine Figur nach rechts und nach oben verschoben, als ich das bbox-Argument in mein Savefig aufgenommen hatte.

2
SuaveSouris

ich folgte dieser Sequenz und es funktionierte wie ein Zauber.

plt.axis ("off")

fig = plt.imshow (Bildfeld, Interpolation = 'am nächsten')

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

Die folgende Funktion enthält die Antwort von johannes oben. Ich habe es mit plt.figure und plt.subplots() mit mehreren Achsen getestet, und es funktioniert gut.

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

Ein viel einfacherer Ansatz, den ich gefunden habe, ist die Verwendung von plt.imsave:

    import matplotlib.pyplot as plt
    arr = plt.imread(path)
    plt.imsave('test.png', arr)
0
Parth92