2012-07-02 2 views
13

Когда я рисую фигуру с помощью matplotlib, как ее сохранить без дополнительных полей? Обычно, когда я сохранить его какСохранение рисунка matplotlib/networkx без полей

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

я его с некоторыми полями:

enter image description here

Пример:

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:

Пространства устанавливаются внутри осей. Это ясно, если я удаляю plt.axis('off')
Так что я думаю, что есть какой-то трюк для использования с пакетом Networkx.

ответ

8

добавить следующие коды для контроля границ участка до экономии.

попробуйте разные значения cut, как от 1.05 до 1.50, пока не увидите нужным.

# 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

Большое спасибо. Он работает, но с удалением некоторой небольшой части пределов фигуры. Я не получу цифру.Поэтому я думаю, мне просто нужно как-то изменить его. – Aya

+2

вы можете попробовать более консервативный разрез (1.10 или 1.05, а не 1.02), просто измените его до тех пор, пока холст не подойдет. – nye17

+0

Я бы предпочел еще один метод, который автоматически фиксирует границы. Я думаю, что это будет с Networkx из-за формы узла – Aya

9

Пробег: plt.savefig("figure.png", bbox_inches="tight").

Редактировать: Ах, вы не упомянули, что используете networkx (хотя теперь я вижу, что он указан в теге). bbox_inches="tight" - это способ плотно обрезать фигуру. Я не знаю, что делает networkx, но я предполагаю, что он устанавливает некоторые параметры графика, которые добавляют дополнительное пространство к осям. Вы должны искать решение в сети, а не matplotlib. (Это может быть, например, что NetworkX добавляет пространство внутри осей, а не фигура, чем это выглядит, как если вы удалите этот axis('off') вызов?)

+0

Это на самом деле не изменяет поля. спасибо – Aya

+0

Можете ли вы привести пример того, что вы подразумеваете под «полями»? – BrenBarn

+0

спасибо. Я не хочу, чтобы фигура была сохранена с лишними пробелами. Я просто хочу, чтобы границы точно закрывали пределы фигуры. Это понятно? – Aya

0

Не зная специфику NetworkX я не могу быть уверен, что это будет работать, но, чтобы полностью удалить пробелы из внешней осей в Matplotlib, вы можете сделать что-то вдоль линий:

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

Немного взлома, но если вы используете nx.draw, то он будет более плотным.

Таким образом, вы могли бы сделать

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

который просто притягивает узлы и никаких ребер. Тогда это нормально делать

nx.draw_networkx_edges(G, pos, width=2, edge_color='b') 
Смежные вопросы