Как подписать ребро графа?

import re 
import networkx as nx
f = open("alice_in_wonderland.txt","r") 
text = f.read() 
text = text.replace('\n', '') 
text = text.replace('`', '') 
text = text.replace('(', '') 
text = text.replace('"', '') 
words = re.split("\s|[,.]", text) 
sentences = re.split("[.!?]", text) 
#print(sentences)  
words = [word for word in words if word != '']  
first_words = [sent.split()[0] for sent in sentences if (sent != '') and (sent != ' ')] 
other_words = [sent.split()[1:-1] for sent in sentences if (sent != '')] 
other_words = sum(other_words, []) 
names = [word for word in other_words if word.istitle()] 
names = list(set(names)) 
verbs = ['has', 'got', 'said', 'is', 'was', 'does', 'wanted', 'did', 'went'] 
not_names = ['Who', 'She', 'He', 'That', 'I', 'You', 'What', 'This', 'Where', 'Which', 'It', 'How', 'Why', 'When', 'But', 'Somebody', 'Here', 'There']  
true_names = [] 
for i in range (0, len(words) - 1):
    if words[i] in names and words[i + 1] in verbs and words[i] not in not_names:
        true_names.append(words[i])

pair_frequency = dict() # подсчитываем частоту встречаемости пар в одном предложении
#{'Сережа Кирилл': 20}
for sent in sentences:
    for name1 in true_names:
        for name2 in true_names:
            if (name1 < name2): # отбрасываем повторяющиеся пары.
                if (sent.find(name1) >= 0) and (sent.find(name2) >= 0):
                    # в словаре уже есть пара name1 name2
                    if (name1+ ' ' + name2 in pair_frequency.keys()):
                        pair_frequency[name1 + ' ' + name2] += 1
                        #print(name1 + ' ' + name2 + str(pair_frequency[name1 + ' ' + name2] ))
                        # в словаре нет пары name1 name2
                    else:
                        pair_frequency[name1 + ' ' + name2] = 1

print(pair_frequency)
schet = []
score = []
hobab = []
true_names = list(set(true_names))
for i in pair_frequency:
  j = i.split(' ')
  #print(i)
  schet.append(j)
for i in pair_frequency:
  j = str(pair_frequency[i])
  #print(i)
  score.append(j)
print(score)
for i in pair_frequency:
  hobab.append([i.split(' ')[0], i.split(' ')[1], pair_frequency[i]])
G = nx.Graph()
G.add_nodes_from(true_names)
G.add_weighted_edges_from(hobab)
#G.add_edges_from(schet)
#labels = {e: G.edges[e]['score'] for e in G.edges}
#FG.add_weighted_edges_from([(1, 2, 0.125), (1, 3, 0.75), (2, 4, 1.2), (3, 4, 0.375)])
nx.draw_circular(G, with_labels= True)
'''options = {
    'width': 1152,
}
nx.draw(G, **options)'''
print(hobab)
print(schet)
print((true_names))

У меня есть словарь pair_frequency, в котором каждая пара является ключом для того числа, которым нужно подписать ребро, соединяющее элементы этой пары.

Как это сделать?


Ответы (2 шт):

Автор решения: MaxU

Пример:

pos = nx.spring_layout(G)
edge_labels = {k:f'{v:.3}' for k,v in nx.get_edge_attributes(G, 'weight').items()}

nx.draw_networkx(G, pos, node_size=700)
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)

В этом примере данные для подписей ребер берутся из атрибутов ребер - в вашем случае их надо брать из словаря.

→ Ссылка
Автор решения: lebed lebedev
import re 
import networkx as nx
import matplotlib.pyplot as plt
plt.figure(3,figsize=(11,6)) 
f = open("alice_in_wonderland.txt","r") 
text = f.read() 
text = text.replace('\n', '') 
text = text.replace('`', '') 
text = text.replace('(', '') 
text = text.replace('"', '') 
words = re.split("\s|[,.]", text) 
sentences = re.split("[.!?]", text) 
#print(sentences)  
words = [word for word in words if word != '']  
first_words = [sent.split()[0] for sent in sentences if (sent != '') and (sent != ' ')] 
other_words = [sent.split()[1:-1] for sent in sentences if (sent != '')] 
other_words = sum(other_words, []) 
names = [word for word in other_words if word.istitle()] 
names = list(set(names)) 
verbs = ['has', 'got', 'said', 'is', 'was', 'does', 'wanted', 'did', 'went'] 
not_names = ['Who', 'She', 'He', 'That', 'I', 'You', 'What', 'This', 'Where', 'Which', 'It', 'How', 'Why', 'When', 'But', 'Somebody', 'Here', 'There']  
true_names = [] 
for i in range (0, len(words) - 1):
    if words[i] in names and words[i + 1] in verbs and words[i] not in not_names:
        true_names.append(words[i])

pair_frequency = dict() # подсчитываем частоту встречаемости пар в одном предложении
#{'Сережа Кирилл': 20}
true_names = list(set(true_names))
for sent in sentences:
    for name1 in true_names:
        for name2 in true_names:
            if (name1 < name2): # отбрасываем повторяющиеся пары.
                if (sent.find(name1) >= 0) and (sent.find(name2) >= 0):
                    # в словаре уже есть пара name1 name2
                    if (name1+ ' ' + name2 in pair_frequency.keys()):
                        pair_frequency[name1 + ' ' + name2] += 1
                        #print(name1 + ' ' + name2 + str(pair_frequency[name1 + ' ' + name2] ))
                        # в словаре нет пары name1 name2
                    else:
                        pair_frequency[name1 + ' ' + name2] = 1

#print(pair_frequency)
schet = []
score = []
hobab = []
true_names = list(set(true_names))
for i in pair_frequency:
  j = i.split(' ')
  #print(i)
  schet.append(j)
for i in pair_frequency:
  j = str(pair_frequency[i] / 4)
  #print(i)
  score.append(j)
#print(score)
for i in pair_frequency:
  hobab.append([i.split(' ')[0], i.split(' ')[1], pair_frequency[i]])
G = nx.Graph()
G.add_nodes_from(true_names)
'''for i in pair_frequency:
  G.add_edge()'''
tn = dict()
for i in true_names:
  tn[i] = i
#print(tn)
widths = nx.get_edge_attributes(G, 'weight')
pos = nx.shell_layout(G)
nx.draw_networkx_edges(G, pos, edgelist = schet, width = list(score), alpha = 0.6)
nx.draw_networkx_nodes(G, pos, nodelist = true_names)
nx.draw_networkx_labels(G, pos, labels = tn)
#G.add_weighted_edges_from(hobab)
#G.add_edges_from(schet)
#labels = {e: G.edges[e]['score'] for e in G.edges}
#FG.add_weighted_edges_from([(1, 2, 0.125), (1, 3, 0.75), (2, 4, 1.2), (3, 4, 0.375)])
#nx.draw_circular(G, with_labels= True)
pos = nx.spring_layout(G)
'''edge_labels = score

nx.draw_networkx(G, pos, node_size = 700)
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)'''
'''options = {
    'width': 1152,
}
nx.draw(G, **options)'''
#print(hobab)
#print(schet)
print((tn))
plt.show()

У меня получилось. Вот это работает так как мне нужно.

→ Ссылка