[英]Plot network from large pandas dataframe using networkx
我在 jupyter 上寫了一個用於網絡統計驗證的程序,最終產品是一個大的 pandas dataframe 5053x5053:
import pandas as pd
network = pd.DataFrame (data = app, index = products, columns = products)
app 是一個二進制矩陣,如果 app[i,j] = 1,則產品 i 鏈接到產品 j。 我想 plot 網絡,我剛剛了解到可以使用 networkx(有時還有其他工具,如 cytoscape)。 由於數據量很大,我不知道如何進行。 哪種表示最好,如何獲得可讀的 plot? 我試圖寫下一些基本代碼,但結果非常令人失望:
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
G = nx.from_pandas_edgelist(network)
nx.draw_random(G)
此外,我有一個包含 212 個綠色產品序列號(數據幀的索引和列)的向量,如果可能的話,我想在同一個 plot 上繪制不同的顏色。
編輯:我使用了代碼,它比我的嘗試效果更好,但它仍然不是一個可讀的圖表。
G = nx.from_numpy_matrix(gg)
G = nx.relabel_nodes(graph, dict(enumerate(greenxgreen.columns)))
nx.draw(G)
我使用了下面虛擬數據部分中的 dataframe ( df
)。 這會給你一個基本的網絡圖。 我鼓勵您在文檔中進一步挖掘(請參閱參考資料部分)。
nx.draw_random()
創建一個隨機排列。 你有很多節點。 所以它會造成混亂。 您可能希望 select 是 dataframe 的一個子集,該子集至少具有一定數量的連接,而 plot 則改為減少混亂。
# G = graph
G = nx.from_numpy_matrix(df.values)
G = nx.relabel_nodes(G, dict(enumerate(df.columns)))
# nx.draw_spectral(G)
# nx.draw_random(G)
# nx.draw_circular(G)
nx.draw(G)
要繪制整個網絡,包括標簽、邊緣等,請使用nx.draw_networkx()
。
nx.draw_networkx(G)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import networkx as nx
%matplotlib inline
## To randomly generate array: a
# Uncomment the following three lines
# seed = 0
# np.random.seed(seed=seed)
# a = (np.random.rand(25).reshape(5,5) >= 0.5).astype(int)
## To use a fixed representation of array: a
a = np.array([
[1, 1, 1, 1, 0],
[1, 0, 1, 1, 0],
[1, 1, 1, 1, 0],
[0, 0, 1, 1, 1],
[1, 1, 0, 1, 0]
])
nodes = list('ABCDE')
df = pd.DataFrame(data=a, index=nodes, columns=nodes)
print(df)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.