2012-07-02 6 views
13

Wenn ich eine Figur unter Verwendung von matplotlib zeichne, wie speichere ich sie ohne zusätzliche Ränder? Normalerweise, wenn ich speichern Sie es alsSpeichern einer matplotlib/networkx-Figur ohne Ränder

plt.savefig("figure.png") # or .pdf 

ich es mit einigen Margen:

enter image description here

Beispiel:

import matplotlib.pyplot as plt 
import networkx as nx 

G=nx.Graph() 

G.add_edge('a','b',weight=1) 
G.add_edge('a','c',weight=1) 
G.add_edge('a','d',weight=1) 
G.add_edge('a','e',weight=1) 
G.add_edge('a','f',weight=1) 
G.add_edge('a','g',weight=1) 

pos=nx.spring_layout(G) 
nx.draw_networkx_nodes(G,pos,node_size=1200,node_shape='o',node_color='0.75') 

nx.draw_networkx_edges(G,pos, 
       width=2,edge_color='b') 

plt.axis('off') 
plt.savefig("degree.png", bbox_inches="tight") 
plt.show() 

Update 2:

Die Räume sind innerhalb der Achsen eingestellt .. Das ist klar, wenn ich entferne plt.axis('off')
Also ich denke, es gibt einen Trick mit dem Paket Networkx zu verwenden.

Antwort

8

die Codes hinzufügen unter Plot Grenzen zu steuern, bevor speichern.

versuchen Sie verschiedene Werte von , wie von 1,05 bis 1,50, bis Sie es für richtig halten.

# adjust the plot limits 
cut = 1.05 
xmax= cut*max(xx for xx,yy in pos.values()) 
ymax= cut*max(yy for xx,yy in pos.values()) 
plt.xlim(0,xmax) 
plt.ylim(0,ymax) 
+0

Vielen Dank. Es funktioniert, aber mit einem kleinen Teil der Grenzen der Figur zu entfernen. Ich bekomme die Figur nicht vollständig.Also ich denke, ich muss es nur irgendwie ändern. – Aya

+2

können Sie einen konservativeren Schnitt (1.10 oder 1.05 statt 1.02) versuchen, ändern Sie es einfach, bis die Leinwand passt. – nye17

+0

Ich würde immer noch eine andere Methode bevorzugen, die automatisch Grenzen festlegt. Ich denke, das wird mit Networkx sein, wegen der Knotenform – Aya

9

Versuchen Sie plt.savefig("figure.png", bbox_inches="tight").

Edit: Ah, du hast nicht erwähnt, dass du networkx benutzt hast (obwohl ich jetzt sehe, dass es in einem Tag aufgeführt ist). bbox_inches="tight" ist der Weg, um die Figur fest zuzuschneiden. Ich weiß nicht, was Networkx macht, aber ich stelle mir vor, dass es einige Plotparameter setzt, die den Achsen zusätzlichen Raum hinzufügen. Sie sollten in networkx nach einer Lösung suchen und nicht nach matplotlib. (Es kann sein, zum Beispiel, dass NetworkX erweitert den Raum innerhalb der Achsen, nicht die Figur, wie sieht es aus, wenn Sie, dass axis('off') Anruf entfernen?)

+0

Dies ist tatsächlich ändert sich nicht die Ränder. danke – Aya

+0

Können Sie ein Beispiel dafür geben, was Sie mit "Margen" meinen? – BrenBarn

+0

danke. Ich möchte nicht, dass die Figur mit zusätzlichen Leerstellen gespeichert wird. Ich möchte nur, dass die Grenzen die Grenzen der Figur genau schließen. Ist das klar? – Aya

0

Ohne die Besonderheiten der NetworkX zu wissen, kann ich nicht sicher sein, dass dies funktionieren wird, aber die Leerzeichen vollständig von der Außenseite eines Achse in matplotlib zu entfernen, können Sie etwas entlang der Linien von tun:

import matplotlib.pyplot as plt 
ax = plt.axes([0, 0, 1, 1]) 
plt.plot(range(10)) 
0

Ein bisschen ein Hack, aber wenn Sie nx.draw verwenden, dann ist es eine engere Passform.

So könnte man

nx.draw(G,pos,node_size=1200,node_shape='o',node_color='0.75', edgelist = []) 

tun, die nur die Knoten zieht und keine Kanten. Dann ist es in Ordnung zu tun

nx.draw_networkx_edges(G, pos, width=2, edge_color='b')