2012-07-02 24 views
13

Cuando dibujo una figura usando matplotlib ¿cómo la guardo sin márgenes adicionales? lo general, cuando lo guardo comoGuardar una figura matplotlib/networkx sin márgenes

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

lo consigo con unos márgenes:

enter image description here

Ejemplo:

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

Actualización 2:

Los espacios se establecen dentro de los ejes .. Esto es claro si elimino plt.axis('off')
Así que creo que hay algún truco para usar con el paquete Networkx.

Respuesta

8

añadir los códigos siguientes para controlar los límites de la trama antes ahorro.

pruebe diferentes valores de cut, como de 1.05 a 1.50, hasta que le parezca conveniente.

# 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

Muchas gracias. Funciona pero eliminando una pequeña parte de los límites de la figura. No entiendo la figura completa.Así que creo que solo necesito modificarlo de alguna manera. – Aya

+2

puede intentar un corte más conservador (1.10 o 1.05 en lugar de 1.02), simplemente cámbielo hasta que encaje el lienzo. – nye17

+0

Todavía preferiría otro método que corrige automáticamente los límites. Creo que esto será con Networkx, debido a la forma del nodo – Aya

9

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

Editar: Ah, usted no mencionó que estaba usando networkx (aunque ahora veo que está en una etiqueta). bbox_inches="tight" es la forma de recortar la figura con fuerza. No sé qué está haciendo networkx, pero me imagino que está configurando algunos parámetros de trazado que están agregando espacio extra a los ejes. Debería buscar una solución en networkx en lugar de matplotlib. (Puede ser, por ejemplo, que NetworkX está agregando el espacio dentro de los ejes, no la figura; lo que hace que se vea como si se quita que axis('off') llamada?)

+0

esto es en realidad no cambia los márgenes. gracias – Aya

+0

¿Puedes dar un ejemplo de lo que quieres decir con "márgenes"? – BrenBarn

+0

gracias. No quiero que la figura se guarde con espacios en blanco adicionales. Solo quiero que las fronteras cierren los límites de la figura exactamente. ¿Está claro? – Aya

0

Sin conocer los detalles de NetworkX no puedo estar seguro de que esto va a funcionar, pero para eliminar el espacio en blanco por completo de la parte exterior de un eje en matplotlib, se puede hacer algo a lo largo de las líneas de:

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

Un poco hackeo, pero si usas nx.draw, entonces se ajusta mejor.

Por lo que podría hacer

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

que acaba dibuja los nodos y sin bordes. Entonces está bien hacer

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