#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
это не то, что вы ищете, то есть не подсчет узлов каждой степени.
Надеюсь, что приведенные выше решения помогут!