Соединять узлы на графике, когда один атрибут одинаков (NetworkX) - PullRequest
0 голосов
/ 21 октября 2018

Я хочу создать график, который автоматически добавляет ребра между узлами, если один конкретный атрибут совпадает.Узлы на моем графике представляют студентов.Я добавляю два атрибута к моим узлам: university_id и full_name.Я хочу добавить грань между двумя людьми, только если они поступают в один университет.

Я искал это решение: NetworkX: добавление ребер к графику из атрибутов узла

После тестирования кажется, что это решение соединяет все ребраграфик, независимо от того, являются ли какие-либо атрибуты одинаковыми.Есть ли простое решение, которое я могу использовать для подключения студентов только на основе их university_id?

Вот мой код:

import matplotlib.pyplot as plt
import networkx as nx
import MySQLdb

# #############################################################################
# Retrieve the data from remote server.
myDB = MySQLdb.connect(host="*,port=3306,user="mysql",passwd="***")
cHandler = myDB.cursor()
cHandler.execute("USE research_project")
cHandler.execute("SELECT * FROM students")
results = cHandler.fetchall()

G = nx.Graph()
for items in results:
        # items[0] is a unique ID, items[1] = university_id, items[2] = full name
        G.add_node(items[0], attr_dict={'university_id': items[1], 'full_name': items[2]})

for node_r, attributes in G.nodes(data=True):
    key_set = set(attributes.keys())
    G.add_edges_from([(node_r, node) for node, attributes in G.nodes(data=True)
                      if key_set.intersection(set(attributes.keys()))
                      and node != node_r])

nx.draw(G)
plt.show()

1 Ответ

0 голосов
/ 22 октября 2018
from __future__ import print_function
import matplotlib.pyplot as plt
import networkx as nx
import MySQLdb


# #############################################################################
# Retrieve the data from remote server.
myDB = MySQLdb.connect(host="*,port=3306,user="mysql",passwd="***")
cHandler = myDB.cursor()
cHandler.execute("USE research_project")
cHandler.execute("SELECT * FROM students")
results = cHandler.fetchall()

G = nx.Graph()
for items in results:
    G.add_node(items[0], attr_dict={'university_id': items[1], 'full_name': items[2]})

for node_r in G.nodes(data=True):
    for node in G.nodes(data=True):
        if node != node_r and node[1]['attr_dict']['university_id'] == node_r[1]['attr_dict']['university_id']:
            G.add_edge(node[0], node_r[0], attr_dict=None)

nx.draw(G, with_labels=True)
plt.show()

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

Предостережение с приведенным выше решением состоит в том, что он чрезвычайно медленный во время выполнения.Я буду обновлять свой ответ всякий раз, когда смогу найти более быстрое решение.

...