0

看来我找不到以下问题的解决方案:

我想按大小(长度,而不是宽度)绘制边缘。

我的意思是,如果 V1 和 V2 顶点之间的边的值等于 20,我想将该边精确地绘制为 20 像素。

如果 V2 和 V3 之间的另一条边为 60,则该边在图中将更长。

我找不到如何指定边缘大小或长度。也许像其他绘图属性(顶点大小、颜色、宽度等)一样简单的代码线是不可能的。Igraph 教程没有给出答案。恐怕很难。

即使我猜固定边会给出一个恒定的形状,图形的形状方向也不重要。

该图是无向的,但有许多顶点和边序列。

4

1 回答 1

3

igraph 中没有边缘属性可以让您直接控制边缘的长度。主要原因是完全满足所有长度约束是不可能的,除非您的图形具有非常稀疏的结构和/或长度非常具体。

我唯一想到的是一种称为多维缩放(MDS)的技术。在不深入细节的情况下,MDS 的输入是一个n x n矩阵(其中n是图中的顶点数),并且矩阵单元包含所需的点之间的距离。MDS 的输出是一些低维空间(通常是 2D 平面)中的顶点排列,其中实际距离和所需距离之间的总平方差被最小化。特别是,如果在 2D 空间中可以完全满足所需的距离,MDS 会为您找到该配置。layout_mdsigraph 在对象方法中包含 MDS 作为布局算法Graph

现在,问题来了。我提到距离矩阵的大小为n x n。问题在于,这意味着您必须为每个顶点对指定距离,而不仅仅是连接的顶点对。我的印象是,您的问题并非如此(即您只有连接的顶点对的距离),在这种情况下,MDS 是无用的,除非您可以以某种方式“近似”断开的顶点对的距离 - 但在这种情况下布局也只是一个近似值。

另一种选择是 Kamada-Kawai 布局(参见 Kamada, T. & Kawai, S. (1989)。绘制一般无向图的算法。信息处理快报31, 7-15),其中边缘被建模为弹簧,每个弹簧具有规定的平衡长度。布局将尝试稳定在接近物理平衡的配置中(在这种情况下,所有弹簧长度都接近其平衡长度,因此它们不会在其端点(即顶点)上施加力)。这里的问题是 igraph 中的 Kamada-Kawai 布局没有准备好处理弹簧的不同平衡长度,即假设每个链接都具有相同的“所需”长度。如果您愿意用 Python 从头开始​​自己实现 Kamada-Kawai 布局,那么这可能是另一种可能性。

于 2012-12-13T19:48:56.713 回答