2024-05-04 09:58:49 发布
网友
我经常遇到并制作复杂网络的长尾度分布/直方图,如下图所示。从许多观察来看,它们使这些尾巴的重尾非常重而且拥挤:
然而,我读过的许多出版物都有更清晰的度分布,在分布的末尾没有这种笨拙,而且观察结果的间隔也更均匀。
啊!
如何使用NetworkX和matplotlib制作这样的图表?
NetworkX
matplotlib
使用log binning(see also)。下面的代码将获取表示度值直方图的Counter对象,并将分布记录到日志箱中,以生成更稀疏、更平滑的分布。
Counter
import numpy as np def drop_zeros(a_list): return [i for i in a_list if i>0] def log_binning(counter_dict,bin_count=35): max_x = log10(max(counter_dict.keys())) max_y = log10(max(counter_dict.values())) max_base = max([max_x,max_y]) min_x = log10(min(drop_zeros(counter_dict.keys()))) bins = np.logspace(min_x,max_base,num=bin_count) # Based off of: http://stackoverflow.com/questions/6163334/binning-data-in-python-with-scipy-numpy bin_means_y = (np.histogram(counter_dict.keys(),bins,weights=counter_dict.values())[0] / np.histogram(counter_dict.keys(),bins)[0]) bin_means_x = (np.histogram(counter_dict.keys(),bins,weights=counter_dict.keys())[0] / np.histogram(counter_dict.keys(),bins)[0]) return bin_means_x,bin_means_y
在NetworkX中生成经典的无标度网络,然后绘制:
import networkx as nx ba_g = nx.barabasi_albert_graph(10000,2) ba_c = nx.degree_centrality(ba_g) # To convert normalized degrees to raw degrees #ba_c = {k:int(v*(len(ba_g)-1)) for k,v in ba_c.iteritems()} ba_c2 = dict(Counter(ba_c.values())) ba_x,ba_y = log_binning(ba_c2,50) plt.xscale('log') plt.yscale('log') plt.scatter(ba_x,ba_y,c='r',marker='s',s=50) plt.scatter(ba_c2.keys(),ba_c2.values(),c='b',marker='x') plt.xlim((1e-4,1e-1)) plt.ylim((.9,1e4)) plt.xlabel('Connections (normalized)') plt.ylabel('Frequency') plt.show()
生成以下图表,显示蓝色的“原始”分布和红色的“装箱”分布之间的重叠。
如果我漏掉了一些显而易见的东西,可以考虑如何改进这种方法或反馈。
使用log binning(see also)。下面的代码将获取表示度值直方图的
Counter
对象,并将分布记录到日志箱中,以生成更稀疏、更平滑的分布。在
NetworkX
中生成经典的无标度网络,然后绘制:生成以下图表,显示蓝色的“原始”分布和红色的“装箱”分布之间的重叠。
如果我漏掉了一些显而易见的东西,可以考虑如何改进这种方法或反馈。
相关问题 更多 >
编程相关推荐