<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          利用Python繪制關(guān)系網(wǎng)絡(luò)圖

          共 7463字,需瀏覽 15分鐘

           ·

          2021-05-25 12:47


          大家好,歡迎來到 Crossin的編程教室 !
          我們在做數(shù)據(jù)可視化時,要展現(xiàn)多個元素之間的相互關(guān)系時(比如人物關(guān)系圖),常會用到網(wǎng)絡(luò)圖。
          今天我們就分享一個在 Python 里繪制網(wǎng)絡(luò)圖的庫:NetworkX,并顯示它的基本操作。

          一、NetworkX 概述

          NetworkX 是一個用 Python 語言開發(fā)的圖論與復(fù)雜網(wǎng)絡(luò)建模工具,內(nèi)置了常用的圖與復(fù)雜網(wǎng)絡(luò)分析算法,可以方便的進行復(fù)雜網(wǎng)絡(luò)數(shù)據(jù)分析、仿真建模等工作。
          NetworkX 支持創(chuàng)建簡單無向圖、有向圖和多重圖;內(nèi)置許多標(biāo)準(zhǔn)的圖論算法,節(jié)點可為任意數(shù)據(jù);支持任意的邊值維度,功能豐富。主要用于創(chuàng)造、操作復(fù)雜網(wǎng)絡(luò),以及學(xué)習(xí)復(fù)雜網(wǎng)絡(luò)的結(jié)構(gòu)、動力學(xué)及其功能。用于分析網(wǎng)絡(luò)結(jié)構(gòu),建立網(wǎng)絡(luò)模型,設(shè)計新的網(wǎng)絡(luò)算法,繪制網(wǎng)絡(luò)等等。

          二、NetworkX 的安裝

          1. pip install networkx -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

          三、NetworkX 基礎(chǔ)知識

          1. 創(chuàng)建圖

          可以利用 networkx 創(chuàng)建四種圖:Graph 、DiGraph、MultiGraph、MultiDiGraph,分別為無多重邊無向圖、無多重邊有向圖、有多重邊無向圖、有多重邊有向圖。
          1. import network as nx

          2. G = nx.Graph()

          3. G = nx.DiGraph()

          4. G = nx.MultiGraph()

          5. G = nx.MultiDiGraph()

          2. 網(wǎng)絡(luò)圖的加點和加邊

          1. import networkx as nx

          2. import matplotlib.pyplot as plt


          3. G = nx.DiGraph()

          4. G.add_node('z') # 添加節(jié)點z

          5. G.add_nodes_from([1, 2, 3]) # 添加節(jié)點 1 2 3

          6. G.add_edge('x', 'y') # 添加邊 起點為x 終點為y

          7. G.add_edges_from([(1, 2), (1, 3), (2, 3)]) # 添加多條邊


          8. # 網(wǎng)絡(luò)圖繪制與顯示

          9. nx.draw(G, with_labels=True)

          10. plt.show()

          運行效果如下:
          為了讓網(wǎng)絡(luò)圖更美觀可以調(diào)節(jié) nx.draw() 方法里的參數(shù)
          1. nx.draw(G, pos=nx.random_layout(G), node_color = 'b', edge_color = 'r', with_labels = True, font_size =18, node_size =20)

          • G:待繪制的網(wǎng)絡(luò)圖G

          • node_size:指定節(jié)點的尺寸大小(默認(rèn)是300)

          • node_color: 指定節(jié)點的顏色 (可以用字符串簡單標(biāo)識顏色,例如'r'為紅色,'g'為綠色這樣)

          • node_shape: 節(jié)點的形狀(默認(rèn)是圓形,用字符串'o'標(biāo)識)

          • alpha: 透明度 (默認(rèn)是1.0,不透明,0為完全透明)

          • width: 邊的寬度 (默認(rèn)為1.0)

          • edge_color: 邊的顏色(默認(rèn)為黑色)

          • style: 邊的樣式(默認(rèn)為實現(xiàn),可選:solid | dashed | dotted | dashdot

          • with_labels:節(jié)點是否帶標(biāo)簽

          • font_size: 節(jié)點標(biāo)簽字體大小

          • font_color: 節(jié)點標(biāo)簽字體顏色(默認(rèn)為黑色)

          3. 運用布局

          circular_layout:節(jié)點在一個圓環(huán)上均勻分布 
          random_layout:節(jié)點隨機分布 
          shell_layout:節(jié)點在同心圓上分布 
          spring_layout:用 Fruchterman-Reingold 算法排列節(jié)點(樣子類似多中心放射狀) 
          spectral_layout:根據(jù)圖的拉普拉斯特征向量排列節(jié)點
          繪制網(wǎng)絡(luò)圖實例如下:
          1. import networkx as nx

          2. import matplotlib.pyplot as plt


          3. # 初始化一個有向圖對象

          4. DG = nx.DiGraph()

          5. DG.add_node('X')

          6. # 添加節(jié)點 傳入列表

          7. DG.add_nodes_from(['A', 'B', 'C', 'D', 'E'])

          8. print(f'輸出圖的全部節(jié)點:{DG.nodes}')

          9. print(f'輸出節(jié)點的數(shù)量:{DG.number_of_nodes()}')

          10. # 添加邊 傳入列表 列表里每個元素是一個元組 元組里表示一個點指向另一個點的邊

          11. DG.add_edges_from([('A', 'B'), ('A', 'C'), ('A', 'D'), ('D', 'A'), ('E', 'A'), ('E', 'D')])

          12. DG.add_edge('X', 'C')

          13. print(f'輸出圖的全部邊:{DG.edges}')

          14. print(f'輸出邊的數(shù)量:{DG.number_of_edges()}')

          15. # 可自定義節(jié)點顏色

          16. colors = ['pink', 'blue', 'green', 'yellow', 'red', 'brown']

          17. # 運用布局

          18. pos = nx.circular_layout(DG)

          19. # 繪制網(wǎng)絡(luò)圖

          20. nx.draw(DG, pos=pos, with_labels=True, node_size=200, width=0.6, node_color=colors)

          21. # 展示圖片

          22. plt.show()

          運行效果如下:
          1. 輸出圖的全部節(jié)點:['X', 'A', 'B', 'C', 'D', 'E']

          2. 輸出節(jié)點的數(shù)量:6

          3. 輸出圖的全部邊:[('X', 'C'), ('A', 'B'), ('A', 'C'), ('A', 'D'), ('D', 'A'), ('E', 'A'), ('E', 'D')]

          4. 輸出邊的數(shù)量:7

          四、利用 NetworkX 實現(xiàn)關(guān)聯(lián)類分析

          利用 soccer.csv 中的數(shù)據(jù),使用 Python 的 NetworkX 包按要求進行繪圖。

          1. 提取數(shù)據(jù)

          統(tǒng)計不同俱樂部(Club)的球員數(shù)量,從球員最多的五個俱樂部抽取 50 名球員信息(球員數(shù)量最多的俱樂部抽取 30 名,剩下 4 個俱樂部各抽取 5 名)構(gòu)成新的 DataFrame,打印其 info()。
          1. import pandas as pd


          2. df = pd.read_csv('soccer.csv', encoding='gbk')

          3. data = df['Club'].value_counts()

          4. # 球員人數(shù)最多的5個俱樂部

          5. clubs = list(data.index[:5])


          6. # 球員數(shù)量最多的俱樂部抽取30名

          7. df1 = df[df['Club'] == clubs[0]].sample(30, axis=0)

          8. # 剩下4個俱樂部各抽取5名

          9. df2 = df[df['Club'] == clubs[1]].sample(5, axis=0)

          10. df3 = df[df['Club'] == clubs[2]].sample(5, axis=0)

          11. df4 = df[df['Club'] == clubs[3]].sample(5, axis=0)

          12. df5 = df[df['Club'] == clubs[4]].sample(5, axis=0)


          13. # 合并多個DataFrame

          14. result = pd.concat([df1, df2, df3, df4, df5], axis=0, ignore_index=True)

          15. # 打亂DataFrame順序

          16. new_result = result.sample(frac=1).reset_index(drop=True)

          17. # new_result.info()

          18. # 抽樣的數(shù)據(jù)保存到excel

          19. new_result.to_excel('samples.xlsx')

          Jupyter Notebook 環(huán)境中讀取 samples.xlsx,打印其 info(),結(jié)果如下:
          1. import pandas as pd


          2. df = pd.read_excel('samples.xlsx')

          3. df.info()

          2. 畫網(wǎng)絡(luò)圖

          在提取出的數(shù)據(jù)的基礎(chǔ)上,通過判斷球員是否屬于同一俱樂部,繪出隨機分布網(wǎng)絡(luò)圖、Fruchterman-Reingold 算法排列節(jié)點網(wǎng)絡(luò)圖與同心圓分布網(wǎng)絡(luò)圖。盡可能讓網(wǎng)絡(luò)圖美觀,如為屬于同一俱樂部的節(jié)點設(shè)置相同的顏色。
          將每個球員當(dāng)作網(wǎng)絡(luò)圖中一個節(jié)點,計算節(jié)點之間的連通關(guān)系,同屬一個俱樂部則連通。
          1. import pandas as pd


          2. df = pd.read_excel('samples.xlsx')

          3. df = df.loc[::, ['Name', 'Club']]

          4. print(df['Club'].value_counts())

          5. datas = df.values.tolist()

          6. name = [datas[i][0] for i in range(len(datas))]

          7. nodes = [str(i) for i in range(len(datas))]

          8. club = [datas[i][1] for i in range(len(datas))]

          9. # print(nodes)

          10. df = pd.DataFrame({'姓名': name, '節(jié)點編號': nodes, '所屬俱樂部': club})

          11. df.to_csv('nodes_info.csv')

          12. with open('record.txt', 'w') as f:

          13. for i in range(len(nodes)):

          14. for j in range(i, len(nodes) - 1):

          15. if datas[i][1] == datas[j+1][1]: # 屬于同一俱樂部

          16. f.write(f'{nodes[i]}-{nodes[j + 1]}-{datas[i][1]}'+ '\n')

          (1) 隨機分布網(wǎng)絡(luò)圖

          1. import networkx as nx

          2. import matplotlib.pyplot as plt

          3. import pandas as pd

          4. from collections importCounter


          5. df = pd.read_csv('nodes_info.csv')['所屬俱樂部']

          6. items = df.values

          7. print(Counter(items))

          8. node_colors = []

          9. # 5個俱樂部 屬于同一個俱樂部的節(jié)點設(shè)置相同顏色

          10. for item in items:

          11. if item == 'Free Agents':

          12. node_colors.append('red')

          13. elif item == 'Real Madrid':

          14. node_colors.append('yellow')

          15. elif item == 'Chelsea':

          16. node_colors.append('blue')

          17. elif item == 'FC Barcelona':

          18. node_colors.append('green')

          19. elif item == 'Manchester Utd':

          20. node_colors.append('pink')



          21. DG = nx.MultiGraph()

          22. DG.add_nodes_from([str(i) for i in range(0, 50)])

          23. DG.nodes()


          24. with open('record.txt', 'r') as f:

          25. con = f.read().split('\n')


          26. edges_list = []

          27. for i in con[:-1]:

          28. edges_list.append(tuple(i.split('-')[:2]))


          29. print(edges_list)

          30. DG.add_edges_from(edges_list)


          31. # 運用布局

          32. pos = nx.random_layout(DG) # 節(jié)點隨機分布

          33. # 繪制網(wǎng)絡(luò)圖

          34. nx.draw(DG, pos, with_labels=True, node_size=200, width=0.6, node_color=node_colors)

          35. # 顯示圖片

          36. plt.show()

          運行效果如下:

          (2) Fruchterman-Reingold 算法排列節(jié)點網(wǎng)絡(luò)圖

          1. import networkx as nx

          2. import matplotlib.pyplot as plt

          3. import pandas as pd

          4. from collections importCounter


          5. df = pd.read_csv('nodes_info.csv')['所屬俱樂部']

          6. items = df.values

          7. print(Counter(items))

          8. node_colors = []

          9. # 5個俱樂部 屬于同一個俱樂部的節(jié)點設(shè)置相同顏色

          10. for item in items:

          11. if item == 'Free Agents':

          12. node_colors.append('red')

          13. elif item == 'Real Madrid':

          14. node_colors.append('yellow')

          15. elif item == 'Chelsea':

          16. node_colors.append('blue')

          17. elif item == 'FC Barcelona':

          18. node_colors.append('green')

          19. elif item == 'Manchester Utd':

          20. node_colors.append('pink')


          21. DG = nx.MultiGraph()

          22. DG.add_nodes_from([str(i) for i in range(0, 50)])

          23. DG.nodes()


          24. with open('record.txt', 'r') as f:

          25. con = f.read().split('\n')


          26. edges_list = []

          27. for i in con[:-1]:

          28. edges_list.append(tuple(i.split('-')[:2]))


          29. print(edges_list)

          30. DG.add_edges_from(edges_list)


          31. # 運用布局

          32. pos = nx.spring_layout(DG) # 用Fruchterman-Reingold算法排列節(jié)點(樣子類似多中心放射狀)

          33. # 繪制網(wǎng)絡(luò)圖

          34. nx.draw(DG, pos, node_size=10, width=0.6, node_color=node_colors)

          35. # 顯示圖片

          36. plt.show()

          運行效果如下:

          (3) 同心圓分布網(wǎng)絡(luò)圖

          1. import networkx as nx

          2. import matplotlib.pyplot as plt

          3. import pandas as pd

          4. from collections importCounter


          5. df = pd.read_csv('nodes_info.csv')['所屬俱樂部']

          6. items = df.values

          7. print(Counter(items))

          8. node_colors = []

          9. # 5個俱樂部 屬于同一個俱樂部的節(jié)點設(shè)置相同顏色

          10. for item in items:

          11. if item == 'Free Agents':

          12. node_colors.append('red')

          13. elif item == 'Real Madrid':

          14. node_colors.append('yellow')

          15. elif item == 'Chelsea':

          16. node_colors.append('blue')

          17. elif item == 'FC Barcelona':

          18. node_colors.append('green')

          19. elif item == 'Manchester Utd':

          20. node_colors.append('pink')


          21. DG = nx.MultiGraph()

          22. DG.add_nodes_from([str(i) for i in range(0, 50)])

          23. DG.nodes()


          24. with open('record.txt', 'r') as f:

          25. con = f.read().split('\n')


          26. edges_list = []

          27. for i in con[:-1]:

          28. edges_list.append(tuple(i.split('-')[:2]))


          29. print(edges_list)

          30. DG.add_edges_from(edges_list)


          31. # 運用布局

          32. pos = nx.shell_layout(DG) # 節(jié)點在同心圓上分布

          33. # 繪制網(wǎng)絡(luò)圖

          34. nx.draw(DG, pos, with_labels=True, node_size=200, width=0.6, node_color=node_colors)

          35. # 顯示圖片

          36. plt.show()

          運行效果如下:
          以上就是利用 NetworkX 繪制關(guān)系網(wǎng)絡(luò)圖的常用方法。
          本文的數(shù)據(jù)和代碼:
          https://306t.com/file/23159928-465081046

          如果文章對你有幫助,歡迎轉(zhuǎn)發(fā)/點贊/收藏~

          作者:葉庭云
          博客:https://blog.csdn.net/fyfugoyfa/
          編輯:Lemon
          來源:Python數(shù)據(jù)之道


          _往期文章推薦_

          繪制漫威人物關(guān)系圖




          如需了解付費精品課程教學(xué)答疑服務(wù)
          請在Crossin的編程教室內(nèi)回復(fù): 666

          瀏覽 179
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大香蕉伊人在线精品 | 亚洲欧美乱伦 | 中文字幕有码无码人妻aV蜜桃 | 夜色色AV | 国产靠逼 |