Python 从networkx中的文件读取具有pos属性的节点

Python 从networkx中的文件读取具有pos属性的节点,python,networkx,Python,Networkx,我是Networkx的新手。我有一个包含节点位置的文件,格式如下 0:23.23 12.23 其中0是节点,23.23和12.23分别是X坐标和Y坐标。 是否有人知道如何使用read\u edgelist(…)或类似的解决方法来读取具有pos属性的节点 感谢使用read_edgelist,您假设已经存在一个边缘列表。但是,您提供的是节点+属性 由于您从具有文件格式(在注释中声明)的文件开始,第一个挑战是将其转换为易于解析的格式。出于这个原因,我建议使用CSV文件格式。要对您的文件执行此操作,我将

我是Networkx的新手。我有一个包含节点位置的文件,格式如下

0:23.23 12.23

其中
0
是节点,
23.23
12.23
分别是X坐标和Y坐标。 是否有人知道如何使用
read\u edgelist(…)
或类似的解决方法来读取具有
pos
属性的节点


感谢使用
read_edgelist
,您假设已经存在一个边缘列表。但是,您提供的是节点+属性

由于您从具有文件格式(在注释中声明)的文件开始,第一个挑战是将其转换为易于解析的格式。出于这个原因,我建议使用CSV文件格式。要对您的文件执行此操作,我将启动终端(Linux和Mac),
cd
,将您的文件放入目录中,并运行以下两个命令:

sed -n 's/ : /,/gpw nodes_replaced1.txt' nodes.txt
这将读取
节点.txt
(或您的文件),将所有出现的
(包括空格)替换为
,并将其保存为
节点\u replaced1.txt
。您可以随意更改文件名

完成后,在终端中运行以下命令

sed -n 's/ /,/gwp nodes.csv' nodes_replaced1.txt
除了在nodes_replaced1.txt中读取、将
[spaces]
替换为
,并将其作为CSV文件写入外,这将执行类似的操作

一旦有了CSV文件,我建议使用Pandas打开CSV文件,并执行以下操作将节点添加到图形中:

In [1]: import pandas as pd

In [2]: import networkx as nx

In [5]: nodes = pd.read_csv('nodes.csv', header=None)

In [6]: nodes
Out[6]: 
   0      1      2
0  0  52.88  52.53
1  1  56.63  49.53
2  2  38.60  69.81
3  3  43.00   2.88

In [7]: G = nx.Graph()

In [8]: G
Out[8]: <networkx.classes.graph.Graph at 0x105e94cd0>

In [9]: for row in nodes.iterrows():
   ...:     G.add_node(row[1][0], x=row[1][1], y=row[1][2])
   ...: 

In [10]: G.nodes(data=True)
Out[10]: 
[(0.0, {'x': 52.880000000000003, 'y': 52.530000000000001}),
 (1.0, {'x': 56.630000000000003, 'y': 49.530000000000001}),
 (2.0, {'x': 38.600000000000001, 'y': 69.810000000000002}),
 (3.0, {'x': 43.0, 'y': 2.8799999999999999})]
[1]中的
:将熊猫作为pd导入
在[2]中:将networkx导入为nx
在[5]中:nodes=pd.read\u csv('nodes.csv',header=None)
在[6]中:节点
出[6]:
0      1      2
0  0  52.88  52.53
1  1  56.63  49.53
2  2  38.60  69.81
3  3  43.00   2.88
[7]中:G=nx.Graph()
In[8]:G
出[8]:
在[9]中:对于节点中的行。iterrows()
…:G.add_节点(行[1][0],x=行[1][1],y=行[1][2])
...: 
在[10]中:G.节点(数据=真)
出[10]:
[(0.0,{'x':52.88000000000003,'y':52.530000000000001}),
(1.0,{'x':56.630000000000003,'y':49.530000000000001}),
(2.0,{'x':38.60000000000001,'y':69.810000000000002}),
(3.0,{'x':43.0,'y':2.879999999})]
您会注意到,当我仅调用
G.nodes()
时,没有x&y位置数据。但是,当我调用
G.nodes(data=True)
时,x和y位置数据被合并

有关如何创建图形以及如何输入与任何节点、边或图形关联的“属性”的更多信息,请参阅本页:


最后,如果@Aric来回答这个问题,如果我错了,请纠正我

不确定NetworkX是否提供此功能,但您始终可以使用基本python读入文件,然后将节点传递给NetworkX。此外,我认为没有指定节点位置的具体方法。只能将“位置”用作“常规节点”属性。另一点是缺少边。这应该是吗?这些职位的用途是什么?我可以问一下,目的是做可视化还是做分析?根据我的经验,NetworkX在分析方面比可视化更有用。出于这个原因,我创建了一些d3可视化。我忘了提到,我也是python新手!!!。据我所知,我应该使用基本python从文件中读取dict@纳布拉,我有另一份关于edgelist的文件。位置用于执行贪婪路由(仅适用于具有邻居信息的节点)。谢谢您的回复。@ericmjl可视化并不重要,因为我的图形有大约10K个节点和20K条边。分析很重要。不过,感谢您的回复,我很高兴看到二维图形。另一方面,我认为Pandas是网络用户使用的一个很好的工具,如果可能的话,我会提出一个功能请求,让NetworkX API访问某种Pandas对象,也许?我有以下文件格式
0:52.88 52.53
1:56.63 49.53
2:38.60 69.81
3:43.00 2.88
我面临的主要问题是读取文件中写入的节点和位置,并将其转换为内置类型的python对象。然后我可以迭代并将其放入
add_node
Ok的
dict
参数中。请看一下我编辑过的答案(大约10分钟后出现)。谢谢。早些时候,我不愿意修改输入文件。