Ich muss ein Bild aufnehmen und es nach einiger Zeit speichern. Die Figur sieht gut aus, wenn ich sie anzeige, aber nach dem Speichern der Figur habe ich einen Leerraum um das gespeicherte Bild. Ich habe die 'tight'
Option für savefig
Methode ausprobiert , hat 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, ein grundlegendes Diagramm mithilfe von NetworkX für eine Figur zu zeichnen und zu speichern. Ich habe festgestellt, dass es ohne Grafik funktioniert, aber wenn ich eine Grafik hinzufüge, bekomme ich einen Leerraum 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()
python
matplotlib
Ahmet Tuğrul Bayrak
quelle
quelle
Antworten:
Ich kann nicht behaupten, dass ich genau weiß, warum oder wie meine „Lösung“ funktioniert, aber das musste ich tun, als ich den Umriss einiger Tragflächenabschnitte - ohne weiße Ränder - in eine PDF-Datei zeichnen wollte. (Beachten Sie, dass ich matplotlib in einem IPython-Notizbuch mit dem Flag -pylab verwendet habe.)
Ich habe versucht, verschiedene Teile davon zu deaktivieren, aber dies führte immer irgendwo zu einem weißen Rand. Möglicherweise müssen Sie dies sogar ändern, um zu verhindern, dass fette Linien in der Nähe der Grenzen der Figur durch fehlende Ränder rasiert werden.
quelle
set_major_locator
notwendig.pad_inches=0
was andere Antworten nicht erwähnen.set_major_locator
war der Schlüssel für mich.pad_inches
half mir.Sie können den weißen Raum Polsterung entfernen , indem Sie
bbox_inches="tight"
insavefig
:Sie müssen das Argument
bbox_inches
als Zeichenfolge verwenden. Vielleicht hat es deshalb bei Ihnen früher nicht funktioniert.Mögliche Duplikate:
Matplotlib-Diagramme: Entfernen von Achsen, Legenden und Leerzeichen
Wie stelle ich die Ränder für eine Matplotlib-Figur ein?
Reduzieren Sie den linken und rechten Rand im Matplotlib-Plot
quelle
fig.savefig()
. (plt.savefig()
wird in diesem Fall nicht funktionieren.)bbox_inches
Option verwenden, gibt es einen anderen Standard, der etwas Platz lässt. Wenn Sie wirklich alles loswerden wollen, müssen Sie auch verwendenpad_inches=0.0
. Natürlich schneidet solch eine enge Polsterung häufig ab, z. B. Exponenten ...pad_inches=-0.1
Ich fand etwas von Arvind Pereira ( http://robotics.usc.edu/~ampereir/wordpress/?p=626 ) und schien für mich zu arbeiten:
quelle
transparent=True
wird es so aussehen lassen, als gäbe es kein Problem, aber es wird nur Leerzeichen verbergen, Bildabmessungen werden nicht in Ordnung sein.pad_inches
! Ich wünschte, ich hätte früher von dieser Option gewusst!pad_inches=.25
Nachdem ich die obigen Antworten ohne Erfolg ausprobiert hatte (und eine Menge anderer Stapelpfosten), funktionierte das, was schließlich für mich funktionierte, einfach
Wichtig ist, dass dies nicht die Argumente bbox oder padding enthält.
quelle
set_axis_off
. Das gespeicherte Bild wird nicht beeinflusst, dasubplots_adjust
die Achse außerhalb der Ausdehnung der Figur liegt und die Henne ohnehin nicht gezeichnet wird. In Jupyter-Notizbüchern müssen Sie die Achse jedoch explizit deaktivieren, da das Inline-Backend diese Einstellungen überschreibt.Die folgende Funktion enthält die obige Antwort von johannes. Ich habe es mit
plt.figure
undplt.subplots()
mit mehreren Achsen getestet und es funktioniert gut.quelle
Ich fand, dass die folgenden Codes perfekt für den Job funktionieren.
quelle
Ich folgte dieser Sequenz und es funktionierte wie ein Zauber.
quelle
Für alle, die lieber in Pixel als in Zoll arbeiten möchten, funktioniert dies.
Plus das Übliche, das Sie auch brauchen werden
Dann können Sie Folgendes verwenden:
quelle
fig.dpi
sondern können stattdessen das Standard-dpi verwendenEin viel einfacherer Ansatz, den ich gefunden habe, ist
plt.imsave
:quelle
plt.savefig()
.Wenn Sie anzeigen möchten, was gespeichert werden soll, empfehle ich die Verwendung der
plt.tight_layout
Transformation, die eigentlich vorzuziehen ist, da bei der Verwendung kein unnötiges Zuschneiden erfolgtplt.savefig
quelle
Dies funktioniert für mich beim Speichern eines numpy-Arrays, das mit imshow to file gezeichnet wurde
quelle