2015-11-10 3 views
-1

Я работаю с регулярной сетью (сетки), которые я создаю, как:NetworkX: построение графика в циклю возвращает неправильный график

import networkx as nx 
N=100 
def graph_creating(N): 
    G=nx.grid_2d_graph(N,N) 
    pos = dict((n, n) for n in G.nodes()) #Dictionary of all positions 
return G, pos 

У меня есть два способа итерации коды. В обоих случаях я удаляю узлы из сети и пытаюсь их нарисовать. В зависимости от того, создаю ли я сеть вначале или внутри цикла, я получаю другое поведение, когда я его создаю.

Моя проблема: Я хочу, чтобы построить сетку после этапа 1 и после 2-й ступени, поэтому для сравнения с неизмененной сетки/графика. Я не в состоянии сделать это правильно, потому что:

  • Если исходная сетка создается внеfor петли, я правильно получить первые участки, но позже участки пусты, как граф никогда не восстанавливается обратно в неизмененном STATU;
  • Если исходная сетка создана внутри цикл for, я всегда получаю неизменную сетку, как если бы удаление не повлияло на нее.

Где еще должен быть размещен граф-блок, чтобы иметь возможность строить график сразу после этапа 1 и 2?

версия 1 граф создается вне цикла for:

G, pos = graph_creating(N) 
nodelist = G.nodes() 
for counter in range(5): 
    G1 = nodelist[2*counter:2*counter+1] 
    G.remove_nodes_from(G1) 
    nx.draw_networkx(G, pos = pos) 
    figurename = 'file{0}.png'.format(counter) 
    plt.savefig(figurename) 

    G2=nodelist[2*counter+1:2*counter+2] 
    G.remove_nodes_from(G2) 
    nx.draw_networkx(G,pos=pos) 
    #it's not clear from your original question if you save this figure or not 

Результат: только первая итерация производит правильные участки. Позже графики пусты, так как график никогда не восстанавливается до неизмененного состояния.

версия 2 график создается внутри цикла for:

for counter in range(5): 
    G, pos = graph_creating(N) 
    nodelist = G.nodes() 
    G1 = nodelist[2*counter:2*counter+1] 
    G.remove_nodes_from(G1) 
    nx.draw_networkx(G, pos = pos) 
    figurename = 'file{0}.png'.format(counter) 
    plt.savefig(figurename) 

    G2=nodelist[2*counter+1:2*counter+2] 
    G.remove_nodes_from(G2) 
    nx.draw_networkx(G,pos=pos) 
    #it's not clear from your original question if you save this figure or not 

Результат: вызовы к nx.draw_networkx результат в неизмененном графа быть построены для каждой итерации. Интересно, проблема в том, как я называю эту функцию, поскольку она всегда отображает график без неудачных узлов. Почему у меня проблема с этим рисунком?.

+0

Я не уверен, что я полностью понимаю, но если ваша проблема в том, что первоначальный график изменяется, то почему бы не просто создать копию, когда enteri каждый цикл, чтобы исходный график не изменялся с помощью 'tmp_G = org_G.copy()'.Кроме того, я не вижу разницы в вашем коде между ** ситуацией 1 ** и ** ситуацией 2 ** –

+0

Разница между сидением 1 и 2 заключается в том, что в сите 1 график создается за пределами цикла, а в сите 2 он создается внутри. В первом случае я получаю ситуацию, когда график берется неповрежденным и применяет файлы 'csv' один за другим, не обновляя граф, что приводит к полному сбою сети после второй итерации. В сите 2 график обновляется на каждой итерации, но он отображается так, как если бы не произошел сбой (но происходит сбой). – FaCoffee

+0

Проблема заключается в том, что при каждой итерации график должен быть нанесен после этапа 1 и этапа 2. С новой итерацией график должен войти в цикл без изменений, чтобы я мог оценить, что происходит на этапах отказа. 'Tmp_G = org_G.copy()' возвращает 'NameError: name 'org_G' не определен'. – FaCoffee

ответ

1
  • Сделайте свой график, создавая блок вне цикла for.
  • Внутри для цикла создать копию графа с помощью tmp_G = G.copy()
  • при использовании draw_netwokx или remove_nodes_from Используйте tmp_G вместо G
  • Если вы хотите сравнить видоизмененные графики для оригинального одного звонка функция draw_networkx с помощью графа G
+1

Это сработало! Это должно иметь какое-то отношение к 'networkx', поскольку я знал, что исходный граф должен быть создан за пределами цикла. В частности, я думаю, что 'nx.draw_network' не очень гибко: по мере того, как изменяется' G', он должен строить его так, как он есть, например. он должен ** следовать ** изменениям 'G'. Но похоже, что нет. Спасибо, в любом случае! – FaCoffee

+1

@FrancescoCastellani "как G меняется, он должен начертить его так, как он есть, например, он должен следовать за изменениями G" ... Что вы подразумеваете под этим? Каждый раз, когда вы говорите ему, чтобы нарисовать 'G', он рисует текущую версию' G'. – Joel

+0

Ну, если бы это было так, мне не нужно было бы копировать его. Это интересный момент: почему поток сценариев работает, если я использую 'H = G.copy()'?И почему это не так, если я использую только 'G'? – FaCoffee

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