復(fù)雜網(wǎng)絡(luò)分析之?dāng)?shù)據(jù)準(zhǔn)備篇
關(guān)系圖之原始數(shù)據(jù)
我給大家編了下面兩組原始數(shù)據(jù),試圖畫(huà)出abcd四元素之間的關(guān)系
nodes_data = [‘a’, ‘b’, ‘c’, ‘d’]
raw_data = [‘acW’, ‘aca’, ‘caE’, ‘ec’, ‘cd’, ‘dc’]
我們做關(guān)系網(wǎng)絡(luò)前的最初始數(shù)據(jù)***就是上面這樣子,這種數(shù)據(jù)格式還是比較簡(jiǎn)單的。
nodes_data表示節(jié)點(diǎn)數(shù)據(jù),用來(lái)在圖中畫(huà)節(jié)點(diǎn)
raw_data中含有共現(xiàn)的相互關(guān)系,但是需要進(jìn)一步的清理規(guī)整。
關(guān)系圖之?dāng)?shù)據(jù)格式
{source: {target: weight}}
source 起點(diǎn)
target 終點(diǎn)
weight權(quán)重(起點(diǎn)到終點(diǎn)次數(shù))
nodes_data = [‘a’, ‘b’, ‘c’, ‘d’]
raw_data = [‘acW’, ‘aca’, ‘caE’, ‘ec’, ‘cd’, ‘dc’]
nodes_data和raw_data整理成有權(quán)有向數(shù)據(jù)格式如下:
{‘a’: {‘c’: 4},
‘c’: {‘a’: 4, ‘d’: 2},
‘d’: {‘c’: 2}}
上面的格式即可用來(lái)畫(huà)有權(quán)有向圖,也可用到無(wú)權(quán)無(wú)向圖,還可畫(huà)有權(quán)無(wú)向圖、無(wú)權(quán)有向圖。
所以數(shù)據(jù)保存,盡量保存為有權(quán)有權(quán)有向格式。盡可能保存多的信息,請(qǐng)用有權(quán)有向數(shù)據(jù)格式。
后面所有的關(guān)系圖數(shù)據(jù)格式均以有權(quán)有向格式為基準(zhǔn)。
如何實(shí)現(xiàn)有權(quán)有向數(shù)據(jù)格式
nodes_data = [‘a’, ‘b’, ‘c’, ‘d’]
raw_data = [‘acW’, ‘aca’, ‘caE’, ‘ec’, ‘cd’, ‘dc’]
||
|| ?
\/
{‘a’: {‘c’: 4},
‘c’: {‘a’: 4, ‘d’: 2},
‘d’: {‘c’: 2}}
這里很難,我估計(jì)我今天也說(shuō)不太清除。這個(gè)只能希望大家悟性比我高,在就是運(yùn)行下,編點(diǎn)簡(jiǎn)單的數(shù)據(jù)實(shí)驗(yàn)試驗(yàn)下,發(fā)現(xiàn)規(guī)律,也就懂了。
networkx需要的數(shù)據(jù)格式
有了上面富有信息量的有向有權(quán)格式數(shù)據(jù)還不行,我們要再將數(shù)據(jù)微調(diào)下,才能使用networkx庫(kù)。
networkx需要啥數(shù)據(jù)格式?
data = {‘a’:{‘b’:1},
‘c’:{‘a’:2},
‘e’:{‘b’:3},
‘b’:{‘a’:4}}
nodes = {‘a’,’b’,’c’,’d’,’e’}
networkx節(jié)點(diǎn)
#首先導(dǎo)入庫(kù),解決中文顯示問(wèn)題
- import networkx as nx
- import matplotlib.pyplot as plt
- from pylab import mpl
- #解決顯示中文問(wèn)題
- # 指定默認(rèn)字體
- mpl.rcParams['font.sans-serif'] = ['SimHei']
- # 解決保存圖像是負(fù)號(hào)'-'顯示為方塊的問(wèn)題
- mpl.rcParams['axes.unicode_minus'] = False
可見(jiàn)networkx創(chuàng)建節(jié)點(diǎn)需要的數(shù)據(jù)很簡(jiǎn)單,就是 字符串或者列表(集合也可以的) 。而且本身nodes數(shù)據(jù)就是列表,直接就能用到networkx構(gòu)建節(jié)點(diǎn)中來(lái)。
但是networkx構(gòu)建邊時(shí)候,要用什么樣式的呢?
networkx無(wú)向邊
可見(jiàn)networkx 無(wú)向邊 的構(gòu)建只需要元組或列表數(shù)據(jù),但是如何從 有權(quán)有向格式數(shù)據(jù) 轉(zhuǎn)化為 元組 或者 列表(集合也可以的) 數(shù)據(jù)呢?
data = {‘a’:{‘b’:1},
‘c’:{‘a’:2},
‘e’:{‘b’:3},
‘b’:{‘a’:4}}
一、無(wú)權(quán)無(wú)向邊
a->b 和b->a是一條邊
data的邊的集合是{(‘e’, ‘b’), (‘c’, ‘a’), (‘a’, ‘b’)}
生成無(wú)權(quán)無(wú)向邊數(shù)據(jù)的代碼:
二、 有權(quán)無(wú)向邊
a->b和b->a使得 ab共出現(xiàn)5次。
有權(quán)無(wú)向邊應(yīng)為{(‘c’, ‘a’, 2), (‘a’, ‘b’, 5), (‘e’, ‘b’, 3)}
networkx有向邊
可見(jiàn)networkx無(wú)向邊的構(gòu)建只需要元組或列表數(shù)據(jù),但是如何從有權(quán)有向格式數(shù)據(jù)轉(zhuǎn)化為元組或者列表(集合也可以的)數(shù)據(jù)呢?
data = {‘a’:{‘b’:1},
‘c’:{‘a’:2},
‘e’:{‘b’:3},
‘b’:{‘a’:4}}
一、無(wú)權(quán)有向邊
a->b 和b->a是一條邊
data的邊的集合是{(‘a’, ‘b’), (‘b’, ‘a’), (‘c’, ‘a’), (‘e’, ‘b’)}
生成無(wú)權(quán)有向向邊數(shù)據(jù)的代碼:
二、有權(quán)有向邊
[(‘a’, ‘b’, 1), (‘c’, ‘a’, 2), (‘e’, ‘b’, 3), (‘b’, ‘a’, 4)]
這樣更好理解些
- weight = data.get(node_k).get(node_v)
其實(shí)涉及到有權(quán)的邊畫(huà)圖,比如讓邊顯示粗細(xì)以表示權(quán)重大小。這個(gè)我還沒(méi)有實(shí)現(xiàn),主要是剛剛學(xué)networkx。不過(guò)今天這篇文章的探討還是很有用的??梢詫?shù)據(jù)整理成其他繪圖軟件指定格式。繪制有權(quán)圖。
寫(xiě)了這么多也不知道大家搞糊涂了沒(méi)有,反正我寫(xiě)的有點(diǎn)暈!