Python 绘制对数分格网络度分布图

Python 绘制对数分格网络度分布图,python,numpy,matplotlib,networkx,scientific-computing,Python,Numpy,Matplotlib,Networkx,Scientific Computing,我经常遇到并制作复杂网络的长尾度分布/直方图,如下图所示。从许多观察结果来看,它们使这些尾巴的末端很重,很拥挤: 然而,我读到的许多出版物都有更清晰的度分布,在分布的末尾没有这种笨拙,观察结果的间隔也更均匀 ! 如何使用NetworkX和matplotlib制作这样的图表?使用()。下面是获取表示度值直方图的计数器对象并记录分布的代码,以生成更稀疏、更平滑的分布 import numpy as np def drop_zeros(a_list): return [i for i in

我经常遇到并制作复杂网络的长尾度分布/直方图,如下图所示。从许多观察结果来看,它们使这些尾巴的末端很重,很拥挤:

然而,我读到的许多出版物都有更清晰的度分布,在分布的末尾没有这种笨拙,观察结果的间隔也更均匀

!

如何使用
NetworkX
matplotlib
制作这样的图表?

使用()。下面是获取表示度值直方图的
计数器
对象并记录分布的代码,以生成更稀疏、更平滑的分布

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()
生成以下曲线图,显示蓝色的“原始”分布和红色的“装箱”分布之间的重叠


如果我错过了一些明显的东西,欢迎思考如何改进这种方法或反馈。

这里的问题到底是什么?看起来你已经达到了你想要的结果。你需要比“让它变得更好”更具体。毫无疑问,只要分享我是如何解决问题的,并在我的方法中遗漏了一些东西时向其他人公开反馈。更好的方法是将问题分解成一个问题,然后自己回答。在这种情况下,你会在对答案的评论中得到反馈,因为现在这个问题应该结束了——但是要解决它,因为你已经发布了很多好的信息!对于noob,这里的x-y标签是什么?x-y标签是:x轴->网络中遇到的度数日志;y轴->这些度数频率的日志。注意-在许多地方,
计数器键()
应替换为
列表(计数器键())
用于较新版本的python(其
计数器键()
不是列表)像您在非网络数据的数据上显示的那样绘制度分布类型的图有意义吗?也就是说,在直方图上使用此图?比如说歪曲的血压数据或计数?谢谢