在格子中绘制无标度网络

时间:2018-03-13 17:31:09

标签: python graph networkx

我想从邻接列表生成图形,但我对节点的定位方式不满意。我希望它们根据预定义的方案定位,该方案类似于具有任意坐标x和y的规则网格,同时仍保持无标度特征。让我举一个例子:一个barabasi-albert网络,节点1位于x_1 = 0.6和y_1 = 0.5,节点2位于x_2 = -0.5和y_2 = 1 ......等等。我有一个每个节点的坐标列表。

1 个答案:

答案 0 :(得分:0)

查看draw_networkx_XXX函数herepos参数。

可以像这样使用:

 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()

output

[编辑]

以下是我们如何从邻接列表构建图形并将实际值分配给节点位置。

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()

output for real values

使用csv文件中的位置非常简单 pos参数实际上应该是一个带有节点名称作为键的字典(我编辑了第一个代码片段来反映)。
因此,如果我们有一个带有节点名称和位置的csv文件,我们只需从中构建一个dict并为pos提供dict。