当一个属性相同时连接图中的节点 (NetworkX)
Connect nodes in a graph when one attribute is the same (NetworkX)
我想创建一个图形,如果一个特定属性相同,它会自动在节点之间添加边。我图中的节点代表学生。我正在向我的节点添加两个属性:university_id
和 full_name
。我只想在两个人上同一所大学时增加他们之间的优势。
我一直在寻找这个解决方案:
从测试来看,这个解决方案似乎连接了图的所有边,无论任何属性是否相同。是否有一个简单的解决方案可以让我仅根据 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()
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()
我在少量数据上测试了上面的方法,它似乎有效。
我有一种预感,所发生的事情与我向节点添加属性的方式有关。
上述解决方案的警告是它在运行时非常慢。只要我能想出更快的解决方案,我就会更新我的答案。
我想创建一个图形,如果一个特定属性相同,它会自动在节点之间添加边。我图中的节点代表学生。我正在向我的节点添加两个属性:university_id
和 full_name
。我只想在两个人上同一所大学时增加他们之间的优势。
我一直在寻找这个解决方案:
从测试来看,这个解决方案似乎连接了图的所有边,无论任何属性是否相同。是否有一个简单的解决方案可以让我仅根据 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()
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()
我在少量数据上测试了上面的方法,它似乎有效。 我有一种预感,所发生的事情与我向节点添加属性的方式有关。
上述解决方案的警告是它在运行时非常慢。只要我能想出更快的解决方案,我就会更新我的答案。