我想使用d3js来可视化我的Django网站用户之间的连接。 我正在重用the force directed graph示例的代码,它要求每个节点都有两个属性(ID和Name)。我在user_profiles_table中为每个用户创建了一个节点,并根据connections_table中的每一行在已创建的节点之间添加了一个边。这是行不通的;当我开始使用connection_table时,networkx会创建新节点。
nodeindex=0
for user_profile in UserProfile.objects.all():
sourcetostring=user_profile.full_name3()
G.add_node(nodeindex, name=sourcetostring)
nodeindex = nodeindex +1
for user_connection in Connection.objects.all():
target_tostring=user_connection.target()
source_tostring=user_connection.source()
G.add_edge(sourcetostring, target_tostring, value=1)
data = json_graph.node_link_data(G)
结果:
{'directed': False,
'graph': [],
'links': [{'source': 6, 'target': 7, 'value': 1},
{'source': 7, 'target': 8, 'value': 1},
{'source': 7, 'target': 9, 'value': 1},
{'source': 7, 'target': 10, 'value': 1},
{'source': 7, 'target': 7, 'value': 1}],
'multigraph': False,
'nodes': [{'id': 0, 'name': u'raymondkalonji'},
{'id': 1, 'name': u'raykaeng'},
{'id': 2, 'name': u'raymondkalonji2'},
{'id': 3, 'name': u'tester1cet'},
{'id': 4, 'name': u'tester2cet'},
{'id': 5, 'name': u'tester3cet'},
{'id': u'tester2cet'},
{'id': u'tester3cet'},
{'id': u'tester1cet'},
{'id': u'raykaeng'},
{'id': u'raymondkalonji2'}]}
如何消除重复的节点?
答案 0 :(得分:3)
您可能会重复节点,因为您的user_connection.target()
和user_connection.source()
函数会返回节点名称,而不是其ID。当您致电add_edge
时,如果图表中不存在端点,则会创建端点,这可以解释您获得重复项的原因。
以下代码应该有效。
for user_profile in UserProfile.objects.all():
source = user_profile.full_name3()
G.add_node(source, name=source)
for user_connection in Connection.objects.all():
target = user_connection.target()
source = user_connection.source()
G.add_edge(source, target, value=1)
data = json_graph.node_link_data(G)
另请注意,如果需要格式正确的json字符串,则应将data
对象转储到json。你可以这样做。
import json
json.dumps(data) # get the string representation
json.dump(data, 'somefile.json') # write to file