2013-07-03 1 views
3

Drawing a huge graph with networkX and matplotlibMatplotlib savefig() на увеличенной в графе

Я по существу reasking связанный вопрос. Думаю, я могу лучше объяснить вопрос. С помощью mathplotlib.show(), вызываемого на большом графике, по умолчанию используется уменьшенный, сгруппированный выход. Мой желаемый конечный пользователь должен использовать mathplotlib.savefig(), чтобы сохранить график для использования в отчете. Однако выход savefig() слишком сильно уменьшен, слишком общий. Изменение размера изображения или dpi не устраняет это. Только уменьшает изображение увеличенного изображения. Есть ли способ увеличить масштаб графика и сохранить его без использования пользовательского интерфейса? С пользовательским интерфейсом я могу увеличивать масштаб, распространять узлы и центрировать вокруг рассматриваемого узла, но я не знаю, как это сделать автоматически.

Соответствующий код:

nx.draw(G,pos,node_color=colorvalues, with_labels = False,node_size=values) 
    fig.set_size_inches(11,8.5) 
    if show ==0: 
     plt.show() 
    if show ==1: 
     plt.savefig(name+" coremem.png",bbox_inches=0,orientation='landscape',pad_inches=0.1) 

ответ

3

Вы можете использовать ax.set_xlim и ax.set_ylim для установки диапазонов x и y. Например,

import networkx as nx 
import matplotlib.pyplot as plt 
import numpy as np 

filename = '/tmp/graph.png' 
G = nx.complete_graph(10) 
pos = nx.spring_layout(G) 
xy = np.row_stack([point for key, point in pos.iteritems()]) 
x, y = np.median(xy, axis=0) 
fig, ax = plt.subplots() 
nx.draw(G, pos, with_labels=False, node_size=1) 
ax.set_xlim(x-0.25, x+0.25) 
ax.set_ylim(y-0.25, y+0.25) 
plt.savefig(filename, bbox_inches=0, orientation='landscape', pad_inches=0.1) 

enter image description here


Чтобы узнать первоначальные пределы (перед вызовом ax.set_xlim и ax.set_ylim), используйте

>>> ax.get_xlim() 
(-0.20000000000000001, 1.2000000000000002) 

ax.get_ylim() 
(-0.20000000000000001, 1.2000000000000002) 
+0

Спасибо. Такая простая команда, глупо, я ее не замечал. В настоящее время я пытаюсь найти математический способ автоматического определения центральной массы сети и увеличения к ней. Например, у меня есть списки для значений x и yvalues ​​соответственно для узлов. Я сделал ax.set_xlim (min (xval) -. 25, max (xval) +. 25), и тот же для yvalues. .25 - хороший буфер. Моя проблема заключается в том, что на большом графике в spring_layout два узла, которые связаны друг с другом, но не связаны с остальными, будут настолько далеки, что он разрушит мой алгоритм ... Я буду работать над этим ... – Brad

+0

Вместо этого центра масс, вы можете использовать медиану «x» и «y» позиций узлов, заданных 'pos'. Я добавил код выше, чтобы показать, что я имею в виду. – unutbu

0

Вы не можете изменить масштаб изображения, так сказать, насколько мне известно, но вы можете установить оси. Например, если ваш исходный граф идет от 1-100 по обеим осям, вы можете программным способом перевести его с 30 до 40 и сохранить это.

 Смежные вопросы

  • Нет связанных вопросов^_^