Привязанные узлы Networkx отображаются в неправильном месте с помощью Matplotib - PullRequest
0 голосов
/ 05 ноября 2019

Я смотрел позиции узлов с помощью networkx, но matplotlib отображает его в неправильном месте. Что очень важно, так это получать одно и то же изображение каждый раз, когда я запускаю скрипт: так, уважение координат узлов является фундаментальным.

Кроме того, представление слишком компактное, заставляя меня слишком быстро увеличивать масштаб и появляется на рисунке 2вместо цифры1. наконец, Matplotlib работает в небольшом масштабе с плавающей точкой [-1,1], где я предпочитаю размер экрана x [0,1280] и y [0,704].

Я перепробовал много исходного кода, но он все еще не выполняет свою работуправильно

import matplotlib.pyplot as plt
import networkx as nx

zero_zero = 'zero_zero'
zero_one = 'zero_one'
one_zero = 'one_zero'
one_one = 'one_one'

foo_1 = 'foo_1'
foo_2 = 'foo_2'
foo_3 = 'foo_3'
bar_1 = 'bar_1'
bar_2 = 'bar_2'
bar_3 = 'bar_3'

stuff_1 = 'stuff_1'
stuff_2 = 'stuff_2'
stuff_3 = 'stuff_3'
waow = 'waow'


fig = plt.figure(figsize=(100,100))

fig, ax = plt.subplots()
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-1.5 , 1.5)
G = nx.Graph()

starpos={zero_zero:(0,0), zero_one:(0,1), one_zero:(1,0), one_one:(1,1), foo_1:(1,0),foo_2:(0.1,0.1),foo_3:(0.2,0.3),bar_1:(0.3,0.2),bar_2:(0.76,.80),bar_3:(0,0.2),stuff_1:(0.8,0.6),stuff_2:(0.3,0.9),stuff_3:(0.7,0.7),waow:(0.4,0.6)}    

for k,v in starpos.items():
    G.add_node(k,pos=v)


G.nodes(data=True)


G.add_edge(foo_1, foo_2)

G.add_edge(foo_3, bar_3)
G.add_edge(bar_1, foo_3)
G.add_edge(bar_1, bar_2)
G.add_edge(bar_3, bar_2)


G.add_edge(stuff_1, stuff_3)
G.add_edge(waow, bar_3)
G.add_edge(bar_2, stuff_3)


G.add_edge(zero_zero, zero_one)
G.add_edge(zero_one, one_zero)
G.add_edge(one_zero, one_one)
G.add_edge(one_one, zero_zero)

pos = nx.spring_layout(G)


nx.draw(G, pos, font_size=16, with_labels=False)
for p in pos:  # raise text positions
    pos[p][1] += 0.07
nx.draw_networkx_labels(G, pos)

plt.show()

networkx matplotlib picture

1 Ответ

0 голосов
/ 06 ноября 2019

Давайте сначала разберемся с неправильным представлением: даже если вы присвоили атрибут 'pos' каждому узлу на графике, команды рисования не используют его вообще.

Когда вы делаете:

nx.draw(G, pos)

аргумент pos - это словарь, ключами которого являются узлы G, а значениями являются позиции, в которых вы хотите, чтобы они были. В вашем случае вы определили pos, используяpos=nx.spring_layout(G). В этой команде каждому узлу первоначально присваивается случайная позиция, а затем он обрабатывает узлы как массы, которые связаны пружинами, и пытается найти, куда узлы переместятся. Поэтому каждый раз, когда он находит другое расположение, и - это важно - его совершенно не волнуют атрибуты узла, которые вы определили.

В вашем случае вы уже определили словарь starpos, который, я считаю, имеет желаемое положение каждого узла. Поэтому нет необходимости назначать атрибут при создании узлов [поскольку networkx не использует атрибуты для назначения позиций]. Затем, когда вы рисуете его, используйте уже созданный словарь, а не spring_layout для создания нового. Попробуйте

nx.draw(G, starpos, font_size=16, with_labels=False)
...