【问题标题】:Reading nodes with pos attribute from file in networkx从networkx中的文件中读取具有pos属性的节点
【发布时间】:2013-12-27 23:53:40
【问题描述】:

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

0 : 23.23 12.23

其中0 是一个节点,23.2312.23 分别是 X 和 Y 坐标。 有谁知道如何读取具有pos 属性的节点,使用read_edgelist(...) 之类的函数或类似的解决方法?

谢谢

【问题讨论】:

  • 不确定 NetworkX 是否提供此功能,但您始终可以使用基本的 python 读取文件,然后将节点传递给 NetworkX。另外我认为没有指定节点位置的特定方法。您只能将位置用作通用节点属性。另一点是您缺少边缘。这应该是吗?这些职位将用于什么职位?
  • 请问,做可视化的目的还是做分析?根据我的经验,NetworkX 在分析方面比可视化更有用。出于这个原因,我破解了一些 d3 可视化。
  • 我忘了说,我也是python新手!!!。据我了解,我应该使用基本的 python 从文件中读取 dict 。 @Nabla我有另一个文件有edgelist。位置用于执行贪婪路由(仅适用于具有邻居信息的节点)。感谢您的回复。
  • @ericmjl 可视化并不重要,因为我的图有一些 10K 节点和 20K 边。分析很重要。不过,很高兴看到可以在 2D 中绘制的图表。谢谢您的回复。

标签: python networkx


【解决方案1】:

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

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

sed -n 's/ : /,/gpw nodes_replaced1.txt' nodes.txt

这将读取nodes.txt(或您的文件),将所有出现的:(包括空格)替换为,,并将其保存为nodes_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})]

您会注意到,当我只调用G.nodes() 时,没有x & y 位置数据。但是,当我调用G.nodes(data=True) 时,会合并 x 和 y 位置数据。

有关如何创建图表以及如何放入与任何节点、边或图表关联的“属性”的更多信息,请参阅此页面:http://networkx.github.io/documentation/latest/tutorial/tutorial.html#nodes

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

【讨论】:

  • 另一方面,我认为 Pandas 是网络人使用的一个很好的工具,如果可能的话,我会提出一个功能请求,让 NetworkX API 访问某种类型的 Pandas 对象,也许?
  • 我有以下文件格式0 : 52.88 52.531 : 56.63 49.532 : 38.60 69.813 : 43.00 2.88
  • 我面临的主要问题是读取文件中写入的节点和位置并将其转换为内置类型的python对象。之后,我可以迭代并将其放入 add_nodedict 参数中
  • 好的,知道了。请看一下我编辑的答案(大约 10 分钟后出现)
  • 谢谢。之前,我不愿意修改输入文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 2017-06-10
  • 2019-08-24
  • 1970-01-01
相关资源
最近更新 更多