Networkx 可以从不同的文件中读取节点和边吗?
Can Networkx read nodes and edges from different files?
我有一个包含这些节点的 csv 文件,每个节点都有相关的坐标,如下所示:
node x y
A1 67.8 15.53
A2 108.74 15.53
B1 67.8 25.33
B2 108.74 25.33
C1 67.8 30.22
C2 108.74 30.22
D1 67.8 37.99
D2 108.74 37.99
E1 67.8 43.84
对于这些节点中的每一个,我都有另一个带边的文件,它表示每个连接节点之间的距离,如下所示:
node1 node2 distance
A1 A2 40.90
A1 B1 9.8
A2 B2 9.8
B1 A1 9.8
...
那么,如何将节点及其对应的边添加到同一个图中?
我试过了,但没用:
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
import numpy
nodes = pd.read_csv('nodes.csv')
print nodes
G = nx.Graph()
for row in nodes.iterrows():
G.add_node(row[1][0], x=row[1][2],y=row[1][3])
edgelist = pd.read_csv('edges.csv')
print edgelist
for i, elrow in edgelist.iterrows():
G.add_edge(elrow.node1,elrow.node2,weight=elrow.distance)
G.nodes(data=True)
nx.draw(G)
plt.show()
我是 Python 的新手,我需要它作为我硕士论文代码的一部分。我使用的是 python 3.6,但我也安装了 2.7 版本。你能帮我完成这项工作吗?
Networkx 有一些 utility functions 可以让您的生活更轻松。
您可以使用 nx.from_pandas_dataframe
直接从您的 edges
DataFrame 生成图表:
edges = pd.read_csv('edges.csv', sep='\s+')
G = nx.from_pandas_dataframe(edges, 'node1', 'node2', ['distance'])
然后您可以通过将 nodes
DataFrame 转换为字典列表来添加节点属性,然后将它们加载到图表中,G
和 G.add_nodes_from(data)
:
nodes = pd.read_csv('nodes.csv', sep='\s+')
data = nodes.set_index('node').to_dict('index').items()
G.add_nodes_from(data)
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
edges = pd.read_csv('edges.csv', sep='\s+')
G = nx.from_pandas_dataframe(edges, 'node1', 'node2', ['distance'])
nodes = pd.read_csv('nodes.csv', sep='\s+')
data = nodes.set_index('node').to_dict('index').items()
G.add_nodes_from(data)
print(G.nodes(data=True))
print(G.edges(data=True))
打印(对于 G.nodes(data=True)
):
NodeDataView({'D1': {'y': 37.990000000000002, 'x': 67.799999999999997}, 'A1': {'y': 15.529999999999999, 'x': 67.799999999999997}, 'C2': {'y': 30.219999999999999, 'x': 108.73999999999999}, 'B2': {'y': 25.329999999999998, 'x': 108.73999999999999}, 'D2': {'y': 37.990000000000002, 'x': 108.73999999999999}, 'C1': {'y': 30.219999999999999, 'x': 67.799999999999997}, 'A2': {'y': 15.529999999999999, 'x': 108.73999999999999}, 'E1': {'y': 43.840000000000003, 'x': 67.799999999999997}, 'B1': {'y': 25.329999999999998, 'x': 67.799999999999997}})
和(对于 G.edges(data=True)
):
EdgeDataView([('A1', 'A2', {'distance': 40.9}), ('A1', 'B1', {'distance': 9.8}), ('B2', 'A2', {'distance': 9.8})])
from_pandas_dataframe
不适用于 networkx v2。
我在这里找到了正确的方法名称:AttributeError: module 'networkx' has no attribute 'from_pandas_dataframe'
对我来说有用的是:
G = nx.from_pandas_edgelist(edges, 'src', 'tgt', edge_attr=True)
之后我就可以使用其余已接受的答案了:
data = nodedf.set_index('id').to_dict('index').items()
G.add_nodes_from(data)
我有一个包含这些节点的 csv 文件,每个节点都有相关的坐标,如下所示:
node x y
A1 67.8 15.53
A2 108.74 15.53
B1 67.8 25.33
B2 108.74 25.33
C1 67.8 30.22
C2 108.74 30.22
D1 67.8 37.99
D2 108.74 37.99
E1 67.8 43.84
对于这些节点中的每一个,我都有另一个带边的文件,它表示每个连接节点之间的距离,如下所示:
node1 node2 distance
A1 A2 40.90
A1 B1 9.8
A2 B2 9.8
B1 A1 9.8
...
那么,如何将节点及其对应的边添加到同一个图中?
我试过了,但没用:
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
import numpy
nodes = pd.read_csv('nodes.csv')
print nodes
G = nx.Graph()
for row in nodes.iterrows():
G.add_node(row[1][0], x=row[1][2],y=row[1][3])
edgelist = pd.read_csv('edges.csv')
print edgelist
for i, elrow in edgelist.iterrows():
G.add_edge(elrow.node1,elrow.node2,weight=elrow.distance)
G.nodes(data=True)
nx.draw(G)
plt.show()
我是 Python 的新手,我需要它作为我硕士论文代码的一部分。我使用的是 python 3.6,但我也安装了 2.7 版本。你能帮我完成这项工作吗?
Networkx 有一些 utility functions 可以让您的生活更轻松。
您可以使用 nx.from_pandas_dataframe
直接从您的 edges
DataFrame 生成图表:
edges = pd.read_csv('edges.csv', sep='\s+')
G = nx.from_pandas_dataframe(edges, 'node1', 'node2', ['distance'])
然后您可以通过将 nodes
DataFrame 转换为字典列表来添加节点属性,然后将它们加载到图表中,G
和 G.add_nodes_from(data)
:
nodes = pd.read_csv('nodes.csv', sep='\s+')
data = nodes.set_index('node').to_dict('index').items()
G.add_nodes_from(data)
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
edges = pd.read_csv('edges.csv', sep='\s+')
G = nx.from_pandas_dataframe(edges, 'node1', 'node2', ['distance'])
nodes = pd.read_csv('nodes.csv', sep='\s+')
data = nodes.set_index('node').to_dict('index').items()
G.add_nodes_from(data)
print(G.nodes(data=True))
print(G.edges(data=True))
打印(对于 G.nodes(data=True)
):
NodeDataView({'D1': {'y': 37.990000000000002, 'x': 67.799999999999997}, 'A1': {'y': 15.529999999999999, 'x': 67.799999999999997}, 'C2': {'y': 30.219999999999999, 'x': 108.73999999999999}, 'B2': {'y': 25.329999999999998, 'x': 108.73999999999999}, 'D2': {'y': 37.990000000000002, 'x': 108.73999999999999}, 'C1': {'y': 30.219999999999999, 'x': 67.799999999999997}, 'A2': {'y': 15.529999999999999, 'x': 108.73999999999999}, 'E1': {'y': 43.840000000000003, 'x': 67.799999999999997}, 'B1': {'y': 25.329999999999998, 'x': 67.799999999999997}})
和(对于 G.edges(data=True)
):
EdgeDataView([('A1', 'A2', {'distance': 40.9}), ('A1', 'B1', {'distance': 9.8}), ('B2', 'A2', {'distance': 9.8})])
from_pandas_dataframe
不适用于 networkx v2。
我在这里找到了正确的方法名称:AttributeError: module 'networkx' has no attribute 'from_pandas_dataframe'
对我来说有用的是:
G = nx.from_pandas_edgelist(edges, 'src', 'tgt', edge_attr=True)
之后我就可以使用其余已接受的答案了:
data = nodedf.set_index('id').to_dict('index').items()
G.add_nodes_from(data)