pandas DataFrame 边列表到 networkX 图对象
pandas DataFrame edge list to networkX graph object
我正在尝试从 DataFrame 创建一个无向图 formatted_unique_edges
- 'weight'
列将纯粹用于使用 plotly:[=29= 的下游可视化中的边缘着色]
source target weight
0 protein_2 protein_3 3
1 protein_2 protein_6 2
2 protein_3 protein_6 2
3 protein_2 protein_4 2
4 protein_2 protein_5 2
5 protein_3 protein_4 2
6 protein_3 protein_5 2
7 protein_4 protein_5 2
8 protein_4 protein_6 1
9 protein_5 protein_6 1
我试图模拟的链接绘图示例中的第一行是:
G = nx.random_geometric_graph(200, 0.125)
edge_x = []
edge_y = []
for edge in G.edges():
x0, y0 = G.nodes[edge[0]]['pos']
x1, y1 = G.nodes[edge[1]]['pos']
edge_x.append(x0)
edge_x.append(x1)
edge_x.append(None)
edge_y.append(y0)
edge_y.append(y1)
edge_y.append(None)
我首先将 formatted_unique_edges
转换为图形,然后尝试使用一些诊断打印语句来模拟上面的代码:
G = nx.from_pandas_edgelist(formatted_unique_edges,
edge_attr=True)
#also tried G = nx.random_geometric_graph(200, 0.125) as per plotly example
edge_x = []
edge_y = []
for edge in G.edges():
print(edge) #('proteinN', 'proteinM')
print(G.nodes[edge[0]]) #{}
print(G.nodes[edge[1]]) #{}
x0, y0 = G.nodes[edge[0]]['pos']
#####
#THROWS KeyError: 'pos' if G is from formatted_unique_edges
#####
#prints {'pos': [float, float]} if G is from nx.random_geometric_graph
x1, y1 = G.nodes[edge[1]]['pos']
edge_x.append(x0)
edge_x.append(x1)
edge_x.append(None)
edge_y.append(y0)
edge_y.append(y1)
edge_y.append(None)
如评论中所述,我从 G.nodes[edge[0]]['pos']
得到 KeyError
。我查看了 spyder 变量资源管理器,nx.random_geometric_graph
中的 G.nodes._nodes
格式为:
{0 : {'pos' : [pos_float, pos_float]},
1 : {'pos' : [pos_float, pos_float]},
...
199 : {'pos' : [pos_float, pos_float]}
}
而 formatted_unique_edges
中的 G.nodes._nodes
的格式为:
{'protein_2' : {},
'protein_3' : {},
'protein_4' : {},
'protein_5' : {},
'protein_6' : {}}
这一切都表明我使用 nx.from_pandas_edgelist
错误地从 formatted_unique_edges
制作了我的 Graph
对象 - 有人可以建议我应该怎么做吗?
谢谢!
蒂姆
您未能为图表生成 layout。 random_geometric_graph
生成图表但不仅如此。它还调用布局来生成坐标 (pos)。
# Convert your dataframe to graph
G = nx.from_pandas_edgelist(formatted_unique_edges, edge_attr=True)
# Generate the layout and set the 'pos' attribute
pos = nx.drawing.layout.spring_layout(G)
nx.set_node_attributes(G, pos, 'pos')
edge_x = []
edge_y = []
for edge in G.edges():
x0, y0 = G.nodes[edge[0]]['pos']
x1, y1 = G.nodes[edge[1]]['pos']
edge_x.append(x0)
edge_x.append(x1)
edge_x.append(None)
edge_y.append(y0)
edge_y.append(y1)
edge_y.append(None)
输出:
>>> G.nodes._nodes
{'protein_2': {'pos': array([0.5830424, 0.0301945])},
'protein_3': {'pos': array([-0.42158911, 0.33654032])},
'protein_6': {'pos': array([0.30069049, 1. ])},
'protein_4': {'pos': array([-0.71990583, -0.51877307])},
'protein_5': {'pos': array([ 0.25776204, -0.84796174])}}
我正在尝试从 DataFrame 创建一个无向图 formatted_unique_edges
- 'weight'
列将纯粹用于使用 plotly:[=29= 的下游可视化中的边缘着色]
source target weight
0 protein_2 protein_3 3
1 protein_2 protein_6 2
2 protein_3 protein_6 2
3 protein_2 protein_4 2
4 protein_2 protein_5 2
5 protein_3 protein_4 2
6 protein_3 protein_5 2
7 protein_4 protein_5 2
8 protein_4 protein_6 1
9 protein_5 protein_6 1
我试图模拟的链接绘图示例中的第一行是:
G = nx.random_geometric_graph(200, 0.125)
edge_x = []
edge_y = []
for edge in G.edges():
x0, y0 = G.nodes[edge[0]]['pos']
x1, y1 = G.nodes[edge[1]]['pos']
edge_x.append(x0)
edge_x.append(x1)
edge_x.append(None)
edge_y.append(y0)
edge_y.append(y1)
edge_y.append(None)
我首先将 formatted_unique_edges
转换为图形,然后尝试使用一些诊断打印语句来模拟上面的代码:
G = nx.from_pandas_edgelist(formatted_unique_edges,
edge_attr=True)
#also tried G = nx.random_geometric_graph(200, 0.125) as per plotly example
edge_x = []
edge_y = []
for edge in G.edges():
print(edge) #('proteinN', 'proteinM')
print(G.nodes[edge[0]]) #{}
print(G.nodes[edge[1]]) #{}
x0, y0 = G.nodes[edge[0]]['pos']
#####
#THROWS KeyError: 'pos' if G is from formatted_unique_edges
#####
#prints {'pos': [float, float]} if G is from nx.random_geometric_graph
x1, y1 = G.nodes[edge[1]]['pos']
edge_x.append(x0)
edge_x.append(x1)
edge_x.append(None)
edge_y.append(y0)
edge_y.append(y1)
edge_y.append(None)
如评论中所述,我从 G.nodes[edge[0]]['pos']
得到 KeyError
。我查看了 spyder 变量资源管理器,nx.random_geometric_graph
中的 G.nodes._nodes
格式为:
{0 : {'pos' : [pos_float, pos_float]},
1 : {'pos' : [pos_float, pos_float]},
...
199 : {'pos' : [pos_float, pos_float]}
}
而 formatted_unique_edges
中的 G.nodes._nodes
的格式为:
{'protein_2' : {},
'protein_3' : {},
'protein_4' : {},
'protein_5' : {},
'protein_6' : {}}
这一切都表明我使用 nx.from_pandas_edgelist
错误地从 formatted_unique_edges
制作了我的 Graph
对象 - 有人可以建议我应该怎么做吗?
谢谢! 蒂姆
您未能为图表生成 layout。 random_geometric_graph
生成图表但不仅如此。它还调用布局来生成坐标 (pos)。
# Convert your dataframe to graph
G = nx.from_pandas_edgelist(formatted_unique_edges, edge_attr=True)
# Generate the layout and set the 'pos' attribute
pos = nx.drawing.layout.spring_layout(G)
nx.set_node_attributes(G, pos, 'pos')
edge_x = []
edge_y = []
for edge in G.edges():
x0, y0 = G.nodes[edge[0]]['pos']
x1, y1 = G.nodes[edge[1]]['pos']
edge_x.append(x0)
edge_x.append(x1)
edge_x.append(None)
edge_y.append(y0)
edge_y.append(y1)
edge_y.append(None)
输出:
>>> G.nodes._nodes
{'protein_2': {'pos': array([0.5830424, 0.0301945])},
'protein_3': {'pos': array([-0.42158911, 0.33654032])},
'protein_6': {'pos': array([0.30069049, 1. ])},
'protein_4': {'pos': array([-0.71990583, -0.51877307])},
'protein_5': {'pos': array([ 0.25776204, -0.84796174])}}