【Python】python 學習筆記 --畫圖(networkx)


【Python】python 學習筆記 --畫圖(networkx)

繪制基本網絡圖

用matplotlib繪制網絡圖
基本流程:
1.導入networkx,matplotlib包
2.建立網絡
3.繪制網絡 nx.draw()
4.建立布局 pos = nx.spring_layout美化作用
最基本畫圖程序

  1.  
    import import networkx as nx #導入networkx包
  2.  
    import matplotlib.pyplot as plt
  3.  
    G = nx.random_graphs.barabasi_albert_graph( 100,1) #生成一個BA無標度網絡G
  4.  
    nx.draw(G) #繪制網絡G
  5.  
    plt.savefig( "ba.png") #輸出方式1: 將圖像存為一個png格式的圖片文件
  6.  
    plt.show() #輸出方式2: 在窗口中顯示這幅圖像

networkx 提供畫圖的函數有:

  1. draw(G,[pos,ax,hold])
  2. draw_networkx(G,[pos,with_labels])
  3. draw_networkx_nodes(G,pos,[nodelist]) 繪制網絡G的節點圖
  4. draw_networkx_edges(G,pos[edgelist]) 繪制網絡G的邊圖
  5. draw_networkx_edge_labels(G, pos[, ...])繪制網絡G的邊圖,邊有label
    ---有layout 布局畫圖函數的分界線---
  6. draw_circular(G, **kwargs)Draw the graph G with a circular layout.
  7. draw_random(G, **kwargs)Draw the graph G with a random layout.
  8. draw_spectral(G, **kwargs)Draw the graph G with a spectral layout.
  9. draw_spring(G, **kwargs)Draw the graph G with a spring layout.
  10. draw_shell(G, **kwargs)Draw networkx graph with shell layout.
  11. draw_graphviz(G[, prog])Draw networkx graph with graphviz layout.

networkx 畫圖參數:
node_size: 指定節點的尺寸大小(默認是300,單位未知,就是上圖中那么大的點)
node_color: 指定節點的顏色 (默認是紅色,可以用字符串簡單標識顏色,例如'r'為紅色,'b'為綠色等,具體可查看手冊),用“數據字典”賦值的時候必須對字典取值(.values())后再賦值
node_shape: 節點的形狀(默認是圓形,用字符串'o'標識,具體可查看手冊)
alpha: 透明度 (默認是1.0,不透明,0為完全透明)
width: 邊的寬度 (默認為1.0)
edge_color: 邊的顏色(默認為黑色)
style: 邊的樣式(默認為實現,可選: solid|dashed|dotted,dashdot)
with_labels: 節點是否帶標簽(默認為True)
font_size: 節點標簽字體大小 (默認為12)
font_color: 節點標簽字體顏色(默認為黑色)
e.g. nx.draw(G,node_size = 30, with_label = False)
繪制節點的尺寸為30,不帶標簽的網絡圖。


布局指定節點排列形式

pos = nx.spring_layout 

建立布局,對圖進行布局美化,networkx 提供的布局方式有:
- circular_layout:節點在一個圓環上均勻分布
- random_layout:節點隨機分布
- shell_layout:節點在同心圓上分布
- spring_layout: 用Fruchterman-Reingold算法排列節點(這個算法我不了解,樣子類似多中心放射狀)
- spectral_layout:根據圖的拉普拉斯特征向量排列節
布局也可用pos參數指定,例如,nx.draw(G, pos = spring_layout(G)) 這樣指定了networkx上以中心放射狀分布.

繪制划分后的社區

先看一段代碼,代碼源自site

  1.  
    partition = community.best_partition(User)
  2.  
    size = float(len(set(partition.values())))
  3.  
    pos = nx.spring_layout(G)
  4.  
    count = 0.
  5.  
     
  6.  
    for com in set(partition.values()) :
  7.  
    count = count + 1.
  8.  
    list_nodes = [nodes for nodes in partition.keys()
  9.  
    if partition[nodes] == com]
  10.  
    nx.draw_networkx_nodes(G, pos, list_nodes, node_size = 50,
  11.  
    node_color = str(count / size))
  12.  
     
  13.  
    nx.draw_networkx_edges(User,pos,with_labels = True, alpha=0.5 )
  14.  
    plt.show()
  15.  
     

communit.best_partition 是社區划分方法,算法是根據Vincent D.Blondel 等人於2008提出,是基於modularity optimization的heuristic方法.
partition的結果存在字典數據類型:
{'1': 0, '3': 1, '2': 0, '5': 1, '4': 0, '6': 0}
單引號里的數據是key,也就是網絡中節點編號。
冒號后面的數值,表示網絡中節點的編號屬於哪個社區。也就是社區標號。如'6': 0表示6節點屬於0社區

  1.  
    list_nodes = [nodes for nodes in partition.keys()
  2.  
    if partition[nodes] == com]

每次循環list_nodes結果是社區i對應的用戶編號。
如第一次循環結果是com = 0, list_nodes= ['1','2','4','6']
第二次循環的結果是com = 1, list_nodes = ['3','6']
這樣每次循環,畫出一個社區的所有節點:

  1.  
    nx.draw_networkx_nodes(G, pos, list_nodes, node_size = 50,
  2.  
    node_color = str(count / size))

循環結束后通過顏色來標識不同社區。

轉自:https://segmentfault.com/a/1190000000527216


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM