2012-07-02 33 views
13

Khi tôi vẽ một hình bằng cách sử dụng matplotlib làm cách nào để lưu hình mà không có thêm lề? Thông thường khi tôi lưu nó nhưLưu hình matplotlib/networkx không có lề

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

tôi nhận được nó với một số lề:

enter image description here

Ví dụ:

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

Cập nhật 2:

Các khoảng trống được đặt bên trong trục .. Điều này rõ ràng nếu tôi xóa plt.axis('off')
Vì vậy, tôi nghĩ có một số mẹo để sử dụng với gói Networkx.

Trả lời

8

thêm các mã bên dưới để kiểm soát giới hạn lô trước tiết kiệm.

thử các giá trị khác nhau của cut, như từ 1,05 đến 1,50, cho đến khi bạn thấy phù hợp.

# 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

Cảm ơn bạn rất nhiều. Nó hoạt động nhưng với việc loại bỏ một phần nhỏ của các giới hạn của hình. Tôi không hoàn thành hình.Vì vậy, tôi nghĩ rằng tôi chỉ cần sửa đổi nó bằng cách nào đó. – Aya

+2

bạn có thể thử cắt giảm bảo thủ hơn (1.10 hoặc 1.05 thay vì 1.02), chỉ cần thay đổi nó cho đến khi canvas phù hợp. – nye17

+0

Tôi vẫn thích phương pháp khác tự động sửa ranh giới. Tôi nghĩ rằng điều này sẽ xảy ra với Networkx, vì hình dạng nút – Aya

9

Hãy thử plt.savefig("figure.png", bbox_inches="tight").

Chỉnh sửa: Ah, bạn đã không đề cập đến bạn đang sử dụng networkx (mặc dù bây giờ tôi thấy nó được liệt kê trong thẻ). bbox_inches="tight" là cách cắt hình chặt chẽ. Tôi không biết những gì networkx đang làm, nhưng tôi tưởng tượng nó thiết lập một số tham số cốt truyện được thêm không gian thêm cho các trục. Bạn nên tìm một giải pháp trong networkx hơn là matplotlib. (Ví dụ: mạngx có thể thêm không gian bên trong các trục , không phải hình, nó trông như thế nào nếu bạn xóa cuộc gọi axis('off')?)

+0

điều này thực sự không thay đổi lề. cảm ơn bạn – Aya

+0

Bạn có thể đưa ra ví dụ về ý nghĩa của "lề"? – BrenBarn

+0

cảm ơn bạn. Tôi không muốn con số được lưu với không gian trắng thêm. Tôi chỉ muốn các biên giới để đóng các giới hạn của con số chính xác. Điều này có rõ ràng không? – Aya

0

Mà không biết các chi tiết cụ thể của networkx tôi không thể chắc chắn rằng điều này sẽ làm việc, nhưng để loại bỏ các khoảng trắng hoàn toàn từ bên ngoài của một trục trong matplotlib, bạn có thể làm điều gì đó dọc theo dòng:

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

Một chút hack, nhưng nếu bạn sử dụng nx.draw, thì nó sẽ phù hợp hơn.

Vì vậy, bạn có thể làm

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

mà chỉ thu hút các nút và không có các cạnh. Sau đó, bạn có thể thực hiện

nx.draw_networkx_edges(G, pos, width=2, edge_color='b') 
Các vấn đề liên quan