@sroush 列出的限制的一种可能解决方法是一起删除节点标签并使用 plt.text 标记您的节点。
见下面的代码:
import networkx as nx
import matplotlib.pyplot as plt
T = nx.balanced_tree(2, 5)
N_nodes=T.number_of_nodes()
fig,ax=plt.subplots(figsize=(10,5))
#Circular layout as an example
pos = nx.circular_layout(T)
#Setting up the text by using node position
texts=[plt.text(pos[i][0],pos[i][1],str(i),rotation=(i/N_nodes)*360,fontsize=10,horizontalalignment='center',verticalalignment='center') for i in range(N_nodes)]
#Plot result
nx.draw(T, pos)
ax.set_aspect('equal')
plt.show()
输出给出:
编辑:使用graphviz_layout(T, prog="twopi") 布局:
import networkx as nx
import matplotlib.pyplot as plt
from networkx.drawing.nx_agraph import graphviz_layout
T = nx.balanced_tree(2, 5)
N_nodes=T.number_of_nodes()
pos = pos = graphviz_layout(T, prog="twopi")
fig,ax=plt.subplots(figsize=(10,5))
texts=[plt.text(pos[i][0],pos[i][1],str(i),rotation=(i/N_nodes)*360,fontsize=10,horizontalalignment='center',verticalalignment='center') for i in range(N_nodes)]
nx.draw(T, pos)
ax.set_aspect('equal')
plt.show()
输出给出:
EDIT 2:微调节点布局:
import networkx as nx
import matplotlib.pyplot as plt
from networkx.drawing.nx_agraph import graphviz_layout
T = nx.balanced_tree(2, 5)
N_nodes=T.number_of_nodes()
first_rot_node=31
N_rot=T.number_of_nodes()-first_rot_node+1
pos = pos = graphviz_layout(T, prog="twopi")
fig,ax=plt.subplots(figsize=(10,5))
cmt=0
for i in range(N_nodes):
if i>=first_rot_node:
cmt+=1
if ((cmt-1)/N_rot)*360<90 or ((cmt-1)/N_rot)*360>=270:
plt.text(pos[i][0],pos[i][1],str(i),rotation=((cmt-1)/N_rot)*360,fontsize=11,horizontalalignment='center',verticalalignment='center')
elif ((cmt-1)/N_rot)*360>=90 and ((cmt-1)/N_rot)*360<270:
plt.text(pos[i][0],pos[i][1],str(i),rotation=((cmt-1)/N_rot)*360+180,fontsize=11,horizontalalignment='center',verticalalignment='center')
else:
plt.text(pos[i][0],pos[i][1],str(i),rotation=0,fontsize=11,horizontalalignment='center',verticalalignment='center')
nx.draw(T, pos)
ax.set_aspect('equal')
plt.show()
输出给出: