Сделайте сюжет networkx красивым - PullRequest
4 голосов
/ 29 марта 2020

Мне нужно построить хорошую сеть, используя следующие данные:

result_set = {('name1', 'job1'), ('name2', 'job2'), ('name3', 'job3'), ('name4', 'job4'), ('name5', 'job5'), ('name6', 'job6'), ('name7', 'job7'), ('name8', 'job8'), ('name9', 'job3'), ('name10', 'job6'), ('name11', 'job3'), ('name12', 'job1'), ('name13', 'job5'), ('name14', 'job9'), ('name15', 'job10'), ('name16', 'job6'), ('name17', 'job7'), ('name18', 'job11'), ('name19', 'job12'), ('name20', 'job13'), ('name21', 'job7'), ('name22', 'job14'), ('name23', 'job15'), ('name24', 'job7'), ('name25', 'job14'), ('name26', 'job9'), ('name27', 'job3'), ('name28', 'job16'), ('name29', 'job16'), ('name30', 'job1'), ('name31', 'job10'), ('name32', 'job9'), ('name33', 'job12'), ('name34', 'job5'), ('name35', 'job7'), ('name36', 'job3'), ('name37', 'job17'), ('name38', 'job3'), ('name39', 'job18'), ('name40', 'job16 / job3'), ('name41', 'Il Foglio'), ('name42', 'job7'), ('name43', 'job19'), ('name44', 'job9'), ('name45', 'job20'), ('name46', 'job18'), ('name47', 'job21')}

Имена уникальны, но не рабочие места, как вы можете видеть. Поэтому я хотел бы построить сеть, которая может отображать кластеры имен по заданиям.

Я сделал это, используя следующий код, но у меня есть некоторые проблемы для визуализации в хорошем формате, без наложения меток и изменение размера узлов в зависимости от степени.

Мой код следующий:

result = zip(names, jobs)

# Converting itertor to set
result_set = set(result)
print(result_set)


G = nx.Graph()
for node_tuple in result_set:
        G.add_edges_from(result_set) # edited after comment
nx.draw(G, with_labels=True)
plt.show()

enter image description here

Не могли бы вы взглянуть и скажите мне, как я мог бы изменить его соответствующим образом, чтобы он лучше читался и отображал узлы в зависимости от степени их узлов?

Предложения и комментарии всегда приветствуются.

1 Ответ

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

Вы можете использовать один из многих алгоритмов компоновки, реализованных в networkx в nx.drawing.layout, чтобы расположить узлы таким образом, чтобы упростить визуализацию сети. Вы можете дополнительно отрегулировать расстояние между узлами, установив k на соответствующее значение.

Кроме того, вы можете установить размер узла, пропорциональный градусу, построив dict из Graph.degree и установив node_size в nx.draw соответственно и увеличив его до желаемый размер, применяя мультипликативный фактор. Вот пример использования spring_layout:

from pylab import rcParams
rcParams['figure.figsize'] = 14, 10
pos = nx.spring_layout(G, scale=20, k=3/np.sqrt(G.order()))
d = dict(G.degree)
nx.draw(G, pos, node_color='lightblue', 
        with_labels=True, 
        nodelist=d, 
        node_size=[d[k]*300 for k in d])

enter image description here

Вы также можете настроить цвет узла в зависимости от того, является ли узел job или name с использованием параметра node_color (я предполагаю, что это не реальный случай, но он дает представление о том, как действовать):

rcParams['figure.figsize'] = 14, 10
pos = nx.spring_layout(G, scale=20, k=3/np.sqrt(G.order()))
colors = [['lightgrey', 'lightblue'][node.startswith('job')] 
          for node in G.nodes()]
d = dict(G.degree)
nx.draw(G, pos, 
        with_labels=True, 
        nodelist=d, 
        node_size=[d[k]*300 for k in d],
        node_color=colors)

enter image description here

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