簡體   English   中英

Plot 網絡來自大型 pandas dataframe 使用 networkx

[英]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)

子網 255x255

解決方案

我使用了下面虛擬數據部分中的 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)

參考

  1. 從 Pandas DataFrame 構建 NetworkX 圖
  2. 文檔: networkx.convert_matrix.from_pandas_dataframe
  3. 文檔: networkx.convert_matrix.from_pandas_edgelist

暫無
暫無

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

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