【问题标题】:Plotting log-binned network degree distributions绘制对数分级网络度分布
【发布时间】:2013-05-05 13:47:28
【问题描述】:

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

但是,我阅读的许多出版物的度数分布更清晰,在分布的末尾没有这种结块,并且观察结果更均匀。

!

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

【问题讨论】:

  • 这里的问题到底是什么?看起来您已经实现了您正在寻找的结果。您需要比“让它变得更好”更具体。
  • 毫无疑问,只是分享我是如何解决问题的,如果我在方法中遗漏了什么,请向其他人提供反馈。
  • 更好的方法,否则它将被关闭,将其分解为一个问题并自己回答。见blog.stackoverflow.com/2011/07/…
  • 在这种情况下,您将在 cmets 中获得关于它们所属的答案的反馈,因为现在这个问题应该被关闭 - 但是修复它,因为您已经发布了很多好的信息!

标签: python numpy matplotlib networkx scientific-computing


【解决方案1】:

使用log binning (see also)。下面的代码采用 Counter 对象表示度值的直方图,并对分布进行 log-bin 以产生更稀疏和更平滑的分布。

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()

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

如果我遗漏了一些明显的东西,欢迎提出如何改进这种方法的想法或反馈。

【讨论】:

  • 对于新手来说,这里的 x-y 标签是什么?
  • x-y标签是:x轴->网络中遇到的度数的对数; y 轴 -> 这些度数的频率的对数。
  • 注意 - 在很多地方 counter_dict.keys() 应该被 list(counter_dict.keys()) 替换为新版本的 python(dict.keys() 不是一个列表)
  • 像您在非网络数据上显示的那样绘制度分布类型图是否有意义?也就是说,在直方图上使用这个图?说偏斜的血压数据或计数?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 2016-07-14
  • 2019-05-26
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多