маркировать узлы снаружи с минимальным перекрытием с другими узлами/ребрами в networkx

Я пытаюсь создать график с метками узлов, напечатанными за пределами узлов. Я могу создать «смещение», как показано ниже, которое решает задачу. Однако иногда метки перекрываются с ребрами (, что нежелательно, так как вокруг узлов много пустых мест, где можно напечатать соответствующие метки ). Мне нужно пометить эти узлы таким образом, чтобы метки не перекрывали ни одно ребро или, по крайней мере, старались максимально минимизировать перекрытие.

import networkx as nx
from networkx.utils import is_list_of_ints, flatten
import matplotlib.pyplot as plt

G=nx.Graph()

G = nx.complete_graph(5)
mapping = {0:'aaaaaaa',1:'bbbbbbb',2:'ccccccc', 3:'dddddddd', 4:'eeeeeeeee'}
G = nx.relabel_nodes(G,mapping)

plt.figure(figsize=(10,10), facecolor="w", frameon=False)
pos = nx.graphviz_layout(G, prog="fdp") #calculate position (x,y) coordinates
nx.draw_networkx_nodes(G,pos,node_size=1200,node_shape='o',node_color='0.75')
nx.draw_networkx_edges(G,pos, width=2,edge_color='b')


#for labeling outside the node
offset =10
pos_labels = {}
keys = pos.keys()
for key in keys:
    x, y = pos[key]
    pos_labels[key] = (x, y+offset)
nx.draw_networkx_labels(G,pos=pos_labels,fontsize=2)
plt.show()

Есть ли какая-либо функция в networkx, которая может справиться с такой ситуацией. Гуглил долго безрезультатно.

19
задан user1597034 14 August 2012 в 04:57
поделиться