I am struggling with the following problem. I want to plot a circular graph of about 100 nodes where I have to manually position them, according to a classification done previously. These nodes have an assigned label which describes them, with different text lengths, and I want to put this label adjacent to the node. The following graph is what I would want to obtain (I draw the blue circle only to show that the labels are perfectly aligned at the periphery): https://i.stack.imgur.com/Qre0Z.png
So far I have only achieved to draw this:https://i.stack.imgur.com/U7bZG.png
Here is the 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()
I guess I have to add and play with
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))
in the loop where I set the rotation of the labels. However, I don't figure out how to set it properly as well as how to avoid to crop the canvas.