对数分 bin 网络度分布的绘制

13

我经常在类似下图的复杂网络中遇到并制作长尾度分布/直方图。它们使得这些尾部变得非常重和拥挤,因为有很多观察值:

经典的长尾度分布

然而,我阅读的许多出版物都有更清晰的度分布图,没有这种分布末端的群集现象,观测值更加均匀。

经典的长尾度分布

如何使用 NetworkX matplotlib 绘制此类图表?


这里的问题是什么?看起来你已经达到了你想要的结果。你需要比“让它变得更好”更具体。 - Hooked
3
没问题,我来分享一下我是如何解决一个问题的,并向其他人征求反馈意见,以确保我的方法没有漏洞。 - Brian Keegan
更好的做法是将其分解为一个问题并自己回答,否则它会被关闭。请参阅http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/。 - Hooked
在这种情况下,您将在答案的评论中获得反馈,因为它们属于那里。目前来看,这个问题应该被关闭 - 但是由于您发布了很多有用的信息,请修复它! - Hooked
1个回答

16

使用对数分箱也可参考)。这里是一段代码,用于接受一个代表度值直方图的计数器对象,并对其进行对数分箱以生成更稀疏和平滑的分布。

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: https://dev59.com/pG025IYBdhLWcg3wLizo
    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()

生成下面的图表,显示蓝色为“原始”分布与红色为“分箱”分布之间的重叠部分。

原始分布与对数分箱分布之间的比较

欢迎提供改进此方法的想法或反馈,如果我忽略了一些显而易见的东西。


对于新手来说,这里的x-y标签是什么? - sAguinaga
1
x-y轴标签为:x轴->网络中遇到的度数的对数;y轴->这些度数的频率的对数。 - FaCoffee
4
请注意 - 在许多地方,counter_dict.keys() 应该被替换为 list(counter_dict.keys()),对于较新版本的 Python 来说(其中 dict.keys() 不是列表)。 - Joel
在非网络数据上展示度分布类型的图表,像您所展示的那样,是否有意义?也就是说,使用这种图表而不是直方图?比如对于偏斜的血压数据或某些计数?谢谢。 - user63230

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接