Ярлыки графа Python Networkx - PullRequest
       14

Ярлыки графа Python Networkx

0 голосов
/ 20 февраля 2019

У меня есть два фрейма данных, которые я использую для создания графа с networkx в Python.Кадры данных df1 (координаты узла) и df2 (информация о ребре) выглядят так:

    location     x      y
0   The Wall     145    570
2   White Harbor 140    480

и

    location    x             y 
56  The Wall    Winterfell    259 
57  Winterfell  White Harbor  247 

Это код, который я реализовал, чтобы попытаться отобразить его:

plt.figure()
G=nx.Graph()

for i, x in enumerate(df1['location']):
  G.add_node(x, pos=(df1['x'][i], df1['y'][i]))

for x, x2, w in zip(df2['location'], df2['x'], df2['y']):
  G.add_edge(x, x2, weight=w)

plt.figure(figsize=(15,15)) 

pos = nx.get_node_attributes(G, 'pos')
weights = nx.get_edge_attributes(G, 'weight') 
nx.draw(G, pos=pos, node_size=40, with_labels=True, fontsize=9)
nx.draw_networkx_edge_labels(G, pos=pos, edge_labels=weights)

plt.show()

Я запускал это пару раз раньше, и, похоже, это сработало, но теперь, после повторного открытия ноутбука jupyter и его повторного запуска, оно не будет работать.У меня в основном две основные проблемы.

  • Если я попытаюсь просто запустить строку nx.draw(G, pos=pos, node_size=40, with_labels=True, fontsize=9), мой график будет отображаться, но метки не будут отображаться, даже если для with_labels установлено значение true.
  • Во-вторых, эта строка nx.draw_networkx_edge_labels(G, pos=pos, edge_labels=weights) теперь показывает мне ошибку не может умножить последовательность на не-int типа 'float'

Я смотрел на это в течение нескольких часов, и яне могу исправить это, есть мысли?


Редактировать: Я могу заставить ярлыки отображаться, если исключить pos = pos из nx.draw, но это будетне работает, если я включу его

1 Ответ

0 голосов
/ 20 февраля 2019

Проблема в том, что вы не указываете атрибут pos для узла Winterfell, а затем, когда вы пытаетесь получить к нему доступ в draw_networkx_edge_labels, он не находит его.

Если выпопробуйте дать ему атрибут позиции, скажем:

      location    x    y
0      TheWall  145  570
1   Winterfell  142  520
2  WhiteHarbor  140  480

Тогда к атрибутам всех узлов можно будет получить правильный доступ, и сеть будет построена по принципу:

plt.figure()
G=nx.Graph()

df1 = df1.reset_index(drop=True)
df2 = df2.reset_index(drop=True)

for i, x in enumerate(df1['location']):
    G.add_node(x, pos=(df1.loc[i,'x'], df1.loc[i,'y']))

for x, x2, w in zip(df2['location'], df2['x'], df2['y']):
    G.add_edge(x, x2, weight=w)

plt.figure(figsize=(15,15)) 

pos = nx.get_node_attributes(G, 'pos')
weights = nx.get_edge_attributes(G, 'weight') 
nx.draw(G, pos=pos, node_size=40, with_labels=True, fontsize=9)
nx.draw_networkx_edge_labels(G, pos=pos, edge_labels=weights)

plt.show()

enter image description here

...