复杂网络度分布(幂律分布)图Python
1. 无向图
直接使用networkx所提供的相关函数。
- 代码
import matplotlib.pyplot as plt # 导入科学绘图包
import networkx as nx
import numpy as np
adj = np.loadtxt('adj.txt', dtype=np.int) # 邻接矩阵
G = nx.from_numpy_matrix(adj) # 网络图
print("某个节点的度:", G.degree(0)) # 返回某个节点的度
# print("所有节点的度:",G.degree())#返回所有节点的度
# print("所有节点的度分布序列:",nx.degree_histogram(G))#返回图中所有节点的度分布序列(从1至最大度的出现频次)
degree = nx.degree_histogram(G) # 返回图中所有节点的度分布序列
print(degree)
x = range(len(degree)) # 生成X轴序列,从1到最大度
y = [z / float(sum(degree)) for z in degree] # 将频次转化为频率
plt.figure(figsize=(5.8, 5.2), dpi=150)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.xlabel("Degree", size=14) # Degree
plt.ylabel("Frequency", size=14) # Frequency
plt.xticks(fontproperties='Times New Roman', size=13)
plt.yticks(fontproperties='Times New Roman', size=13)
plt.loglog(x, y, '.')
plt.show() # 显示图表
- 效果图(与有向图 3 一致)
2. 有向图
- 代码
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from collections import Counter
'''
统计表方法
csv文件 每行[id,indegree,outdegree,degree]
画度分布图
'''
data = pd.read_csv('度.csv') # 数据类型为每个节点的度值
namelist = ['入度', '出度', '度']
for i in range(1,4):
# 数据列,
degree = np.array(data.iloc[:,[0,i]])
# 分布统计
counts = Counter(d for n, d in degree)
b = [counts.get(i, 0) for i in range(max(counts) + 1)]
x = range(len(b)) # x轴
y = [z for z in b] # y轴
# 画图
plt.figure(figsize=(5.8, 5.2), dpi=150)
plt.xlabel("Degree")
plt.ylabel("Frequency")
plt.xticks(fontproperties='Times New Roman', size=14)
plt.yticks(fontproperties='Times New Roman', size=14)
plt.loglog(x, y, '.')
plt.savefig('figure/'+namelist[i-1]+'分布图.png') # 保存图片
plt.show()
- 效果图
入度
出度
度