igraph 中没有边缘属性可以让您直接控制边缘的长度。主要原因是完全满足所有长度约束是不可能的,除非您的图形具有非常稀疏的结构和/或长度非常具体。
我唯一想到的是一种称为多维缩放(MDS)的技术。在不深入细节的情况下,MDS 的输入是一个n x n矩阵(其中n是图中的顶点数),并且矩阵单元包含所需的点之间的距离。MDS 的输出是一些低维空间(通常是 2D 平面)中的顶点排列,其中实际距离和所需距离之间的总平方差被最小化。特别是,如果在 2D 空间中可以完全满足所需的距离,MDS 会为您找到该配置。layout_mds
igraph 在对象方法中包含 MDS 作为布局算法Graph
。
现在,问题来了。我提到距离矩阵的大小为n x n。问题在于,这意味着您必须为每个顶点对指定距离,而不仅仅是连接的顶点对。我的印象是,您的问题并非如此(即您只有连接的顶点对的距离),在这种情况下,MDS 是无用的,除非您可以以某种方式“近似”断开的顶点对的距离 - 但在这种情况下布局也只是一个近似值。
另一种选择是 Kamada-Kawai 布局(参见 Kamada, T. & Kawai, S. (1989)。绘制一般无向图的算法。信息处理快报,31, 7-15),其中边缘被建模为弹簧,每个弹簧具有规定的平衡长度。布局将尝试稳定在接近物理平衡的配置中(在这种情况下,所有弹簧长度都接近其平衡长度,因此它们不会在其端点(即顶点)上施加力)。这里的问题是 igraph 中的 Kamada-Kawai 布局没有准备好处理弹簧的不同平衡长度,即假设每个链接都具有相同的“所需”长度。如果您愿意用 Python 从头开始自己实现 Kamada-Kawai 布局,那么这可能是另一种可能性。