我想从邻接列表生成图形,但我对节点的定位方式不满意。我希望它们根据预定义的方案定位,该方案类似于具有任意坐标x和y的规则网格,同时仍保持无标度特征。让我举一个例子:一个barabasi-albert网络,节点1位于x_1 = 0.6和y_1 = 0.5,节点2位于x_2 = -0.5和y_2 = 1 ......等等。我有一个每个节点的坐标列表。
答案 0 :(得分:0)
查看draw_networkx_XXX函数here的pos
参数。
可以像这样使用:
import networkx as nx
import matplotlib.pyplot as plt
from random import randint,seed;
seed(1)
nodes = list(range(5))
edges = [ (nodes[i-1],nodes[i]) for i in range(1,len(nodes)) ]
# here we can set the coordinates to our liking
positions = { node:(randint(0,9),randint(0,9)) for node in nodes }
G=nx.Graph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)
nx.draw_networkx(G,pos=positions, with_labels=False, node_size=100)
plt.show()
[编辑]
以下是我们如何从邻接列表构建图形并将实际值分配给节点位置。
import networkx as nx
import matplotlib.pyplot as plt
from random import randint,seed
from pprint import pprint
seed(0)
edges = [ (randint(0,5),randint(0,5)) for i in range(5) ]
G=nx.Graph()
# nodes added automatically with add_edges_from
G.add_edges_from(edges)
# here we can set positions to our liking
positions = { node: (round((5-randint(0,9))/7.0,2)
, round((5-randint(0,9))/7.0,2)) for node in G.nodes }
pprint({ "edges:": edges, "nodes:":list(G.nodes), "positions:":positions }, width=100)
nx.draw_networkx(G, pos = positions, with_labels=False, node_size=100)
plt.show()
使用csv文件中的位置非常简单
pos
参数实际上应该是一个带有节点名称作为键的字典(我编辑了第一个代码片段来反映)。
因此,如果我们有一个带有节点名称和位置的csv文件,我们只需从中构建一个dict并为pos
提供dict。