Построить распределение степеней в логарифмическом масштабе

#python #python-3.x #graph #networkx #social-networking

#питон #python-3.x #График #networkx #социальные сети

Вопрос:

У меня есть график в 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()
 

Я ожидал получить такую диаграмму:

введите описание изображения здесь

но я получаю нечто совсем другое: введите описание изображения здесь

Что не так с моим графиком распределения степеней? Я не могу найти, что я делаю неправильно.

Ответ №1:

Я знаю два способа получения распределения степеней:

1. Использование функции NetworkX degree_histogram(документы):

Вот пример того, как использовать:

 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('Degreen(log scale)')
plt.ylabel('Number of Nodesn(log scale)')
plt.xscale("log")
plt.yscale("log")
plt.plot(aux_x, aux_y, 'o')
 

О вашей реализации:

Я считаю, что ваш degrees список действителен. Однако numOfNodes это не то, что вы ищете, то есть не подсчет узлов каждой степени.
Надеюсь, что приведенные выше решения помогут!