日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python绘制节点是饼状图的社交网络图(Plot network with pie chart)

發布時間:2024/3/13 python 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python绘制节点是饼状图的社交网络图(Plot network with pie chart) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

問題描述

問題拆解

數據準備

繪圖思路

代碼實現

總結

成圖

network 性質?

參考


問題描述

????????專業描述:想要繪制一幅社交網絡圖,并且每個節點上繪制一個餅狀圖。

???????大白話:韓韓(樓主)有一天突發奇想,想要畫一張圖,可以一目了然的展現好友關系以及不同好友的各項興趣愛好。

問題拆解

數據準備

原始CSV數據下載鏈接:

鏈接:https://pan.baidu.com/s/1LuNH-6YDsoyGqqJL2JbKYA?
提取碼:7as7?
?

好友名單以及興趣愛好表(表名為:friend_node.csv)。

這里的source就是代表樓主和樓主的朋友們,node_label表示樓主及朋友們的名稱。node_size表示樓主和朋友們的相對身高或者balabalaa,任意代表個人屬性的性質。share1-shre4表示樓主及朋友們在攝影、游泳、做飯、瑜伽這四項興趣愛好的相對時間分布情況,這四項相加為100。

樓主與好友的關系表。(表名為:friend_edge.csv

這里的source和target分別表示樓主和朋友們,比如(1,2)就表示樓主和LL是好朋友。

繪圖思路

用Gephi其實可以做出漂亮的network圖,但是樓主還需要在每個node上添加代表不同朋友的興趣的屬性,Gephi暫時還實現不了。就轉戰python。

繪制思路其實分為如下幾步:

  • 提取數據,用python從CSV文件中提取node和edge的數據?,F實分析問題時,大都需要處理大量的數據,所以樓主附上此步的code,對python小白來說非常友好。(此處需點贊!!!)
  • 選取繪制網絡圖的package,python中有多個package均可實現繪制網絡圖,如NetworkX、PyVis、Visdcc in Dash。(詳細請閱讀:https://towardsdatascience.com/visualizing-networks-in-python-d70f4cbeb259)。樓主選取的是networkX包,(這可能就是第一眼就喜歡上的package,呸,瞎說,第一眼搜到的package)。這個包可以整體繪制網絡圖、也可以將node,edge分次繪制。就類似ps的圖層概念,一層一層畫,疊加起來,順著這個思路,要實現目的,就可以先繪制出edge,然后在每個node的位置繪制上pie圖。之后再補充細節,如添加node的label等。

代碼實現

# -*- coding: utf-8 -*- """ Created on Sun Jun 20 23:21:27 2021@author: HJ """ ############################################################################## import csv import numpy as np import networkx as nx import matplotlib.pyplot as plt############################################################################## ################################# 數據提取 #################################### ############################################################################## ######讀取node的表頭 with open('friend_node.csv', 'r', encoding='UTF-8') as nodecsv: # Open the filereader=csv.reader(nodecsv)header_row=next(reader) for index,column_header in enumerate(header_row):print(index,column_header)######提取node表 with open('friend_node.csv', 'r', encoding='UTF-8') as nodecsv: # Open the filenodereader = csv.reader(nodecsv) # Read the csv 不讀表頭nodes = [n for n in nodereader][1:] print(nodes) node_names = [n[0] for n in nodes]###定義node的weight node_weight = [n[2] for n in nodes]#由于這樣定義的node weigt是文本格式,所以將文本轉化為數值 node_weight = np.array(node_weight) print("node weight", node_weight) node_weight_float = [ float(x) for x in node_weight ] max_node_weight = max(node_weight_float) min_node_weight = min(node_weight_float)#定義node 的label node_label = [n[1] for n in nodes]#將node的屬性以字典的形式儲存 temp_attrs = [n[3:7] for n in nodes] #這里儲存的信息是為了畫pie圖 attrs = dict(zip(node_names,temp_attrs)) #組成字典 print(attrs)######讀取edge表 with open('friend_edge.csv', 'r', encoding='UTF-8') as edgecsv: # Open the fileedgereader = csv.reader(edgecsv) # Read the csvedges_all = [tuple(e) for e in edgereader][1:] # Retrieve the data print(edges_all) edges = [i[0:2][::-1] for i in edges_all] #提取前兩列的數據 print(edges)############################################################################## ################################# 繪制network ################################ ############################################################################## ######設置畫布大小,數值越大,后面畫的像素越高、越清晰 plt.figure(4,figsize=(50,40)) ###### make graph G = nx.DiGraph() #這里一定要選擇有向圖,后面才可以畫出curve G.add_nodes_from(node_names,weight = node_weight ) #添加節點 G.add_edges_from(edges) #添加邊#######確定布局方式 pos = nx.spring_layout(G,k=1/3.3,scale=6,seed = 10,weight='weight') ''' 參數解釋: #k值決定了節點之間的距離,默認的設定是1/sqrt(n),n是節點數量。一般情況下,當k<1時,節點多集中在圓心內; 當k>1時,節點向圓周分布 #scale值會同比例的放大或者縮小節點的相對位置,scale<1,畫面越擠;scale>1,畫面越分散。 #seed,固定初始的隨機數的位置,若不固定,每次畫出的圖布局都不一樣,原理是spring_layout這種布局算法會初始先隨機找一個點,然后通過不斷的迭代對點的位置進行優化。 ''' ######顯示網絡圖的基本屬性 density = nx.density(G) print("Network density:", density)######繪制節點的label node_labels = dict(zip(G.nodes,node_label)) nx.draw_networkx_labels(G, pos=pos, labels = node_labels, font_size=50,alpha=0.98 ) ''' 這里font_size決定了node label 的大小 alpha 的大小決定了label的透明度 ''' ######繪制edge nx.draw_networkx_edges(G,edge_color='gray', arrowsize = 5, width=0.8, pos=pos, connectionstyle='arc3,rad=0.2')#在這里添加屬性,添加顏色和大小 print(nx.info(G)) ''' arrowsize表示有向圖里邊的箭頭的大小 connectionstyle='arc3,rad=0.2':其實設置的邊的弧度,繪制出曲線,默認是直線 ''' ######繪制pie圖 #設置pie圖里每個扇形的顏色 colors = ['orangered', 'dodgerblue', 'gold', 'darkseagreen'] #設置pie圖的legend的label labels1 = [u'Photography',u'Swimming',u'Cooking',u'Yoga'] #定義標簽b = -1 for node in G.nodes:attributes = attrs[node]attribute_float = list(map(lambda x:float(x), attributes))b = b + 1current_radius = (node_weight_float[b] - min_node_weight)*0.5/(max_node_weight-min_node_weight) + 0.2'''node的weight,這里設置一個線性函數,調整node size的相對大小,并將該數值賦值給pie圖的半徑'''a = plt.pie(attribute_float, # center=pos[node], #pie圖的位置就是node的位置labels=labels1, #給pie圖添加label,由于所有pie圖的label是一致的,所以只需繪制一次legend即可colors = colors ,pctdistance = 0.6,textprops = { 'fontsize':0}, #set label fontsize to zero so it won't showradius=current_radius, #調整pie圖的半徑wedgeprops={'alpha':0.9}) #調整透明度if b == 0: # only draw legend onceplt.legend(loc='upper right', prop={'size': 50}) ###設置坐標軸 ''' 坐標軸的大小一定要和網絡圖匹配,否則會導致一些node,edge或者node label 顯示不出來 ''' plt.ylim(-9.5,8) plt.xlim(-9,11)###保存圖片 plt.savefig('friend.png') #一定放在plt.show()之前 plt.show()

總結

成圖

?最終的圖片是不是超美!!!不接受反駁~

network 性質?

以下是該網絡的一些基本性質,如節點個數是10個,共有50條邊,平均入度是5,出度也是5。

print(nx.info(G))
Name:?
Type: DiGraph
Number of nodes: 10
Number of edges: 50
Average in degree: ? 5.0000
Average out degree: ? 5.0000

參考

以下代碼參考鏈接:(樓主為了繪制此圖,搜索了n多鏈接,累的快要吐血,最終篩選如下有用的幾個鏈接)

  • networkX包的官方說明文件,請務必詳讀!!!https://networkx.org/documentation/stable/reference/generated/networkx.drawing.layout.spring_layout.html;
  • 繪制pie圖的參考文件?:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html
  • 一些其他參考:https://blog.csdn.net/u012111465/article/details/72797032

原創不易,覺得有用請點贊收藏轉發。多謝!!!

完結,撒花~

總結

以上是生活随笔為你收集整理的Python绘制节点是饼状图的社交网络图(Plot network with pie chart)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人三级在线播放 | 日韩欧美亚洲综合 | 天天视频黄色 | 孕妇丨91丨九色 | 午夜精品一二三区 | 国产一区二区av | 免费人妻精品一区二区三区 | 日韩夜色| 91精品国产一区二区三区 | 日本美女性生活视频 | 男人的天堂97| 韩国电影一区二区三区 | 青青视频免费 | 伊人网在线播放 | 欧美一区二区三区久久久 | 五月天爱爱| 色悠悠在线视频 | 国产aaa| 国产黄色网 | 亚洲天堂五码 | 亚洲欧美激情图片 | 少妇一级淫片免费观看 | 欧美色啪| 视频1区2区| 国产成人无码网站 | 亚洲天堂高清 | 亚洲痴女| 日韩在线精品视频 | 中文字幕免费高清 | 欧美国产日本在线 | 国产娇小hdxxxx乱 | 黄色一级大片免费看 | 在线观看av的网址 | 国产女主播一区 | 成人免费观看视频大全 | 九九九九九精品 | 在线观看国产小视频 | 久久96视频 | 国产精品成人在线观看 | xxxx999 | 日韩精品一区二区三区无码专区 | 少妇高潮喷水在线观看 | 成人福利在线免费观看 | 日韩第六页 | 91丨九色丨丰满人妖 | 九九久久久久 | 日韩福利一区 | 自拍偷拍欧美亚洲 | 成人小视频在线免费观看 | 99国产精| 国产黄色在线播放 | av爱爱爱 | 91性高潮久久久久久久久 | 秋霞国产精品 | 日本a√在线观看 | 日本高清视频免费观看 | 美女脱衣服一干二净 | 中文字幕无人区二 | 男女性高潮免费网站 | 久久天堂电影 | 亚洲天堂网一区二区 | 在线黄色免费 | 日韩91视频 | 国产一级色 | 亚洲av无码一区二区三区网址 | 免费日b视频 | 免费播放毛片精品视频 | 日本一区中文 | 天天天操 | 在线免费一区 | 精品肉丝脚一区二区三区 | 神马午夜电影一区二区三区在线观看 | 国产福利99| av777777| 国产馆视频 | 亚洲a毛片 | 在线观看av黄色 | 日本一区二区高清视频 | 好大好舒服视频 | 天天综合网天天综合 | 第四色视频 | 99色| 无码国产69精品久久久久网站 | 国产精品成人无码免费 | 成人在线精品视频 | 亚洲成年人在线观看 | 久久久精品动漫 | 丁香久久久 | 五月天婷婷在线视频 | 成人免费午夜 | 男女野外做受全过程 | 日韩视频免费在线播放 | 日本中文字幕在线不卡 | 日韩女优中文字幕 | 国产激情一区二区三区视频免樱桃 | 日韩欧美一区在线 | 免费在线观看成年人视频 | 成人免费无码大片a毛片 | 五月天精品 |