【发布时间】:2020-09-11 23:14:14
【问题描述】:
我有一些矩形,其中包含由有向边连接的文本,我的代码如下:
import matplotlib.pyplot as plt
plt.close()
pos_rec={0: (0,0), 1:(20,30), 2:(50,10)}
text_rec={0:"ShortText", 1:"A Bit Longer", 2:"A Much Longer Text" }
ax = plt.gca()
edges=((0,1),(1,2),(2,0))
for i in pos_rec:
plt.text(pos_rec[i][0],pos_rec[i][1],s=text_rec[i],fontsize=15,fontweight="bold", bbox=dict(boxstyle='round',facecolor='red', edgecolor='r', pad=0.7),horizontalalignment='center')
for edge in edges:
ax.annotate("",xy=pos_rec[edge[0]], xytext=pos_rec[edge[1]],
arrowprops=dict(arrowstyle="<|-,head_length=1,head_width=0.5",lw=2, shrinkA=18, shrinkB=20, color='b')
)
plt.show()
现在的问题是边缘卡在盒子里,这当然看起来不是很漂亮 - 我可以通过在边缘之后绘制盒子来解决这个问题,所以重叠被盒子隐藏了但是边缘箭头可能消失;
使用选项 shrinkA 和 shrinkB 我可以调整起点和终点的箭头长度,因此理论上我可以手动修复它,使箭头确实在矩形处结束。问题是这些箭头卡在盒子中的深度不同 - 此外,根据我选择的比例,箭头可能在这些盒子内更深或更浅;
不同尺度的代码输出可见这里:
所以对我来说很自然的问题是:是否有可能让这些边缘直接在这些矩形的边界处结束?
这是否可以独立于缩放来完成,即无论我放大还是缩小,边缘总是在矩形的边界处结束?
如果这些边缘是弯曲的,如下例所示?
【问题讨论】:
标签: python matplotlib networkx