python - 以对数尺度绘制度数分布
问题描述
我在networkx中有一个图表,我试图绘制度数分布。所以我写了以下代码:
g = nx.read_edgelist('graph.txt', create_using= nx.Graph(), nodetype=int)
print(nx.info(g))
numOfNodes = []
for i in range(0, g.number_of_nodes()):
numOfNodes.append(i)
s = sorted(g.degree, key=lambda x: x[1], reverse=True)
degrees = sorted([x[0] for x in s])
frequency = sorted([x[1] for x in s])
plt.loglog(numOfNodes, degrees)
plt.xlabel("Degree")
plt.ylabel("No. of nodes (Frequency)")
plt.title("Degree distribution")
plt.show()
我希望得到这样的图表:
我的度数分布图有什么问题?我找不到我做错了什么。
解决方案
这些是我知道获得度分布的两种方法:
1.使用networkX degree_histogram函数(docs):
下面是一个关于如何使用的例子:
def plot_degree_histogram(g, normalized=True):
print("Creating histogram...")
aux_y = nx.degree_histogram(g)
aux_x = np.arange(0,len(aux_y)).tolist()
n_nodes = g.number_of_nodes()
if normalized:
for i in range(len(aux_y)):
aux_y[i] = aux_y[i]/n_nodes
return aux_x, aux_y
2. 如果您使用权重,请按照networkX 文档中的此示例进行操作:
def plot_degree_histogram(g, normalized=True, weight=None):
degree_sequence = sorted([d for n, d in g.degree(weight=weight)], reverse=True) # degree sequence
degreeCount = collections.Counter(degree_sequence)
aux_x, aux_y = zip(*degreeCount.items())
n_nodes = g.number_of_nodes()
aux_y = list(aux_y)
if normalized:
for i in range(len(aux_y)):
aux_y[i] = aux_y[i]/n_nodes
return aux_x, aux_y
绘图
简单如:
plt.title('\nDistribution Of Node Linkages (log-log scale)')
plt.xlabel('Degree\n(log scale)')
plt.ylabel('Number of Nodes\n(log scale)')
plt.xscale("log")
plt.yscale("log")
plt.plot(aux_x, aux_y, 'o')
关于你的实施:
我相信你的degrees
清单是有效的。然而numOfNodes
,这不是您要寻找的,即不是每个度数的节点计数。
希望以上解决方案有所帮助!