首页 > 解决方案 > 以对数尺度绘制度数​​分布

问题描述

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

我希望得到这样的图表:

在此处输入图像描述

但我得到了很多不同的东西: 在此处输入图像描述

我的度数分布图有什么问题?我找不到我做错了什么。

标签: pythonpython-3.xgraphnetworkxsocial-networking

解决方案


这些是我知道获得度分布的两种方法:

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,这不是您要寻找的,即不是每个度数的节点计数。
希望以上解决方案有所帮助!


推荐阅读