簡體   English   中英

pandas DataFrame 邊緣列表到網絡X 圖 object

[英]pandas DataFrame edge list to networkX graph object

我正在嘗試從 DataFrame formatted_unique_edges創建一個無向圖 - 'weight'列將純粹用於使用plotly在下游可視化中進行邊緣着色:

    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

我試圖模擬的鏈接 plotly 示例中的第一行是:

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轉換為 Graph,然后嘗試使用一些診斷打印語句來模擬上面的代碼:

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 變量資源管理器,來自G.nodes._nodesnx.random_geometric_graph具有以下格式:

{0   : {'pos' : [pos_float, pos_float]}, 
 1   : {'pos' : [pos_float, pos_float]},
 ...
 199 : {'pos' : [pos_float, pos_float]}
}

而來自formatted_unique_edgesG.nodes._nodes具有以下格式:

{'protein_2' : {},
 'protein_3' : {},
 'protein_4' : {},
 'protein_5' : {},
 'protein_6' : {}}

這一切都表明我正在使用 nx.from_pandas_edgelist 錯誤地從formatted_unique_edges制作我的Graph nx.from_pandas_edgelist - 有人可以建議我應該怎么做嗎?

謝謝! 蒂姆

您錯過了為圖表生成布局 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)

Output:

>>> 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])}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM