Метки в NetworkX - PullRequest
       25

Метки в NetworkX

0 голосов
/ 04 декабря 2018

У меня довольно сложная сеть.

    Number of nodes: 2435
    Number of edges: 7497
    Average degree:   6.1577

Я хочу добавить метки в сеть, что мне удалось сделать, однако из-за количества узлов это выглядит не очень хорошо.

Network with labels Есть ли возможность получить каждый пятый лейбл?Что может сделать его немного более читабельным.Меня особенно интересуют метки для странного полукруга около 6 часов.

В качестве альтернативы есть способ нанести на график узлы и связанные ребра, которые имеют наивысшую степень центральности.

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

Код:

cast_1_tup = castdf[['cast_0','cast_1']].apply(tuple, axis=1)
cast_2_tup = castdf[['cast_0','cast_2']].apply(tuple, axis=1)
cast_3_tup = castdf[['cast_0','cast_3']].apply(tuple, axis=1)
cast_4_tup = castdf[['cast_0','cast_4']].apply(tuple, axis=1)
cast_5_tup = castdf[['cast_1','cast_2']].apply(tuple, axis=1)
cast_6_tup = castdf[['cast_1','cast_3']].apply(tuple, axis=1)
cast_7_tup = castdf[['cast_1','cast_4']].apply(tuple, axis=1)
cast_8_tup = castdf[['cast_2','cast_3']].apply(tuple, axis=1)
cast_9_tup = castdf[['cast_2','cast_4']].apply(tuple, axis=1)
cast_10_tup = castdf[['cast_3','cast_4']].apply(tuple, axis=1)

G = nx.Graph()
G.add_edges_from(cast_1_tup)
G.add_edges_from(cast_2_tup)
G.add_edges_from(cast_3_tup)
G.add_edges_from(cast_4_tup)
G.add_edges_from(cast_5_tup)
G.add_edges_from(cast_6_tup)
G.add_edges_from(cast_7_tup)
G.add_edges_from(cast_8_tup)
G.add_edges_from(cast_9_tup)
G.add_edges_from(cast_10_tup)

# write in UTF-8 encoding
fh = open('edgelist.utf-8', 'wb')
fh.write('# -*- coding: utf-8 -*-\n'.encode('utf-8'))  # encoding hint for emacs
nx.write_multiline_adjlist(G, fh, delimiter=',', encoding='utf-8')

# read and store in UTF-8
fh = open('edgelist.utf-8', 'rb')
H = nx.read_multiline_adjlist(fh, delimiter=',', encoding='utf-8')

plt.figure(figsize=(40,40))
plt.axis('off')
pos = nx.spring_layout(G, scale =2)
nx.draw_networkx(G, pos, cmap = plt.get_cmap('jet'), node_colour = values , node_size=80, with_labels=False)
for p in pos:  # raise text positions
    pos[p][1] += 0.04
nx.draw_networkx_labels(G, pos)
plt.show()

1 Ответ

0 голосов
/ 06 декабря 2018

Вы можете достичь нескольких вещей, о которых вы просите, рисуя элементы графика отдельно, а не все сразу, как вы делаете сейчас с помощью nx.draw_networkx.

В частности, попробуйтеразделение чертежа на три части:

nx.draw_networkx_nodes(G, pos=pos)
nx.draw_networkx_edges(G, pos=pos)
nx.draw_networkx_labels(G, pos=pos, labels=l)

В этом случае, указав параметр labels для функции draw_networkx_labels, вы сможете контролировать КАКИЕ метки, которые вы хотите отобразить.Это должен быть словарь, основанный на фактическом значении метки, и он может отображаться на что угодно - либо на себя, либо на что-то другое.И кажется, что вам не нужно указывать их все, так что вы можете программно определить, что входит в этот словарь, и опустить остальные:

l = {'node-1':'node-1'}

Так что это должно напечатать только одну метку, а не остальные.

Кроме того, очень просто, поскольку вы показываете свой график с помощью plt.show (), обратите внимание на небольшой класс увеличения внизу.Это позволяет увеличивать столько раз, сколько вы хотите, на очень детальный уровень.Если этого достаточно, то вам даже не нужно ничего делать.

...