Posición relativa de las tags de nodo NetworkX

Estoy luchando con el siguiente problema. Quiero trazar un gráfico circular de unos 100 nodos donde tengo que posicionarlos manualmente, de acuerdo con una clasificación realizada anteriormente. Estos nodos tienen una etiqueta asignada que los describe, con diferentes longitudes de texto, y quiero colocar esta etiqueta junto al nodo. El siguiente gráfico es lo que querría obtener (solo dibujo el círculo azul para mostrar que las tags están perfectamente alineadas en la periferia): http://sofes.miximages.com/python/Qre0Z.png

Hasta ahora solo he logrado dibujar esto: http://sofes.miximages.com/python/U7bZG.png

Aquí está el MWE:

import numpy as np import networkx as nx import matplotlib.pyplot as plt n = 7 G = nx.complete_graph(n) node_list = sorted(G.nodes()) angle = [] angle_dict = {} for i, node in zip(xrange(n),node_list): theta = 2.0*np.pi*i/n angle.append((np.cos(theta),np.sin(theta))) angle_dict[node] = theta pos = {} for node_i, node in enumerate(node_list): pos[node] = angle[node_i] labels = {0:'zero',1:'oneone',2:'twotwo',3:'threethreethree',4:'fourfourfourfour',5:'fivefivefivefivefive',6:'sixsixsixsixsixsix'} # figsize is intentionally set small to condense the graph f = plt.figure(figsize=(2,2)) r = f.canvas.get_renderer() plt.axis('equal') nx.draw(G,pos=pos,with_labels=True) description = nx.draw_networkx_labels(G,pos,labels=labels) for node, t in description.items(): t.set_rotation(angle_dict[node]*360.0/(2.0*np.pi)) plt.show() 

Supongo que tengo que añadir y jugar con

 x, y = t.get_position() bb = t.get_window_extent(renderer=r) radius = 1.0+2.0*bb.width/r.width t.set_position((radius*x,radius*y)) 

En el bucle donde configuro la rotación de las tags. Sin embargo, no entiendo cómo configurarlo correctamente y cómo evitar recortar el canvas.

Para mostrar las tags fuera de los ejes, deberá hacer que los ejes sean pequeños en comparación con la figura, por ejemplo, introduciendo un gran margen alrededor de los ejes. También deberá establecer el estado del clip del texto, de modo que no se corte con los ejes.

La ubicación de las tags de acuerdo con el ancho del cuadro delimitador requeriría transformar el cuadro delimitador de las coordenadas de visualización a las coordenadas de datos primero.

Solución completa:

 import numpy as np import networkx as nx import matplotlib.pyplot as plt n = 7 G = nx.complete_graph(n) node_list = sorted(G.nodes()) angle = [] angle_dict = {} for i, node in zip(xrange(n),node_list): theta = 2.0*np.pi*i/n angle.append((np.cos(theta),np.sin(theta))) angle_dict[node] = theta pos = {} for node_i, node in enumerate(node_list): pos[node] = angle[node_i] labels = {0:'zero',1:'oneone',2:'twotwo',3:'threethreethree',4:'fourfourfourfour',5:'fivefivefivefivefive',6:'sixsixsixsixsixsix'} # figsize is intentionally set small to condense the graph fig, ax = plt.subplots(figsize=(5,5)) margin=0.33 fig.subplots_adjust(margin, margin, 1.-margin, 1.-margin) ax.axis('equal') nx.draw(G,pos=pos,with_labels=True, ax=ax) description = nx.draw_networkx_labels(G,pos,labels=labels) r = fig.canvas.get_renderer() trans = plt.gca().transData.inverted() for node, t in description.items(): bb = t.get_window_extent(renderer=r) bbdata = bb.transformed(trans) radius = 1.2+bbdata.width/2. position = (radius*np.cos(angle_dict[node]),radius* np.sin(angle_dict[node])) t.set_position(position) t.set_rotation(angle_dict[node]*360.0/(2.0*np.pi)) t.set_clip_on(False) plt.show() 

introduzca la descripción de la imagen aquí