Как нарисовать график с разными размерами узлов Networkx - PullRequest
1 голос
/ 09 марта 2020

Я рассчитал степень центральности для узлов с весом связей между узлами. Следующая задача - нарисовать график с узлами разных размеров. Например, если степень центральности> 4, размер узла = 1500, если <4 = 500. Помогите понять, где ошибка. </p>

import matplotlib.pyplot as plt
import networkx as nx
import numpy as np

A = [[0, 1.51, 0, 1.71, 0],
     [0, 0, 2.11, 1.81, 2.31],
     [0, 0, 0, 1.31, 1.41],
     [0, 0, 0, 0, 1.11],
     [0, 0, 0, 0, 0]]

G = nx.from_numpy_matrix(np.matrix(A), create_using=nx.DiGraph)

layout = nx.spring_layout(G)
labels = nx.get_edge_attributes(G, "weight")


# a list of the node labels in the right order
raw_labels = ["A1", "K2", "D3", "E4", "Z30"]
lab_node = dict(zip(G.nodes, raw_labels))

print("Degree centrality weight")
d = G.degree(weight='weight')
print(d)

for x in d:
    if x[1] > 4:
        large = x
        print (large)
    else:
        small = x
        print (small)

nx.draw(G, layout)
nx.draw_networkx_nodes(G, layout, edgelist=large, node_size=100)
nx.draw_networkx_nodes(G, layout, edgelist=small, node_size=1500)
nx.draw_networkx_edge_labels(G, layout, edge_labels=labels)
nx.draw_networkx_labels(G, layout, labels=lab_node, font_size=10, font_family='sans-serif')
plt.show()

1 Ответ

0 голосов
/ 09 марта 2020

Следующий код работает. В вашем коде были некоторые проблемы: сначала, как уже упоминал Джоэл в комментариях, вы использовали small и large в качестве переменных, но хотели, чтобы они были в списке. Во-вторых, вы использовали edgelist вместо nodelist в draw_networkx_nodes. Я заменил nx.draw на nx.draw_networkx_edges (и добавил plt.axis("off")), чтобы позволить другим пользователям рисовать узлы меньшего или большего размера, чем размер по умолчанию, поскольку меньшие размеры не будут работать с nx.draw.

В качестве последней личной рекомендации я бы заменил имена переменных, такие как d, G или small, на более длинные, не требующие пояснений имена, такие как node_degrees, graph, node_with_low_degrees .

import matplotlib.pyplot as plt
import networkx as nx
import numpy as np

A = [[0, 1.51, 0, 1.71, 0],
     [0, 0, 2.11, 1.81, 2.31],
     [0, 0, 0, 1.31, 1.41],
     [0, 0, 0, 0, 1.11],
     [0, 0, 0, 0, 0]]

G = nx.from_numpy_matrix(np.matrix(A), create_using=nx.DiGraph)

layout = nx.spring_layout(G)
labels = nx.get_edge_attributes(G, "weight")


# a list of the node labels in the right order
raw_labels = ["A1", "K2", "D3", "E4", "Z30"]
lab_node = dict(zip(G.nodes, raw_labels))

print("Degree centrality weight")
d = G.degree(weight='weight')
print(d)

large = []
small = []
for node in G:
    if d[node] > 4: 
        large.append(node)
    else:
        small.append(node)

print("Small", small)
print("Large", large)

nx.draw_networkx_edges(G, layout)
nx.draw_networkx_nodes(G, layout, nodelist=large, node_size=100)
nx.draw_networkx_nodes(G, layout, nodelist=small, node_size=1500)
nx.draw_networkx_edge_labels(G, layout, edge_labels=labels)
nx.draw_networkx_labels(G, layout, labels=lab_node, font_size=10, font_family='sans-serif')
plt.axis("off")
plt.show()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...