gpt4 book ai didi

wolfram-mathematica - 稍作修改后重新布局图,同时保留原始布局的特征

转载 作者:行者123 更新时间:2023-12-04 13:24:39 29 4
gpt4 key购买 nike

在Mathematica 8中,有没有简单的方法可以执行以下操作?

  • 构造一个图形,并使用某些图形布局显示它。
  • 略微修改图形(例如,添加或删除边或顶点)。
  • 从原始布局开始重新计算布局,以某种方式保留对象的“形状”或多或少。例如。从先前布局的坐标开始,重新运行 Spring -电气布局算法。

  • 如果图形在两个显示之间没有改变,则布局也不应改变(或仅改变很小)。都可以使用新的 GraphGraphPlot的显示。

    编辑:本质上,我需要类似图形的相似布局。我总是通过修改现有的图(可能已经被布局)来获得相似的图,但是任何通用的解决方案都是可以接受的。

    编辑2:这是在这种情况下有用的示例。转到 http://ccl.northwestern.edu/netlogo/models/GiantComponent,然后单击“在浏览器中运行”(需要Java)。单击设置,然后单击执行。您可以看到图形在演变。如果我们在Mathematica中执行此操作,那么每个连续的图将看起来完全不同,并且很难看到它正在演变为同一图。在某些应用程序中,能够可视化图形的细微变化非常有用。但是,如果进行了许多连续的更改,则必须重新计算布局,仅淡化或突出显示边缘是不够的。再说一次,这只是一个例子:我不是在尝试使用Mathematica对图表进行动画处理,也不是想像巨型组件的出现。

    最佳答案

    这是在MMA 8.0中更改图形的两种基本方法。第一个依赖于HighlightGraph,尤其是GraphHighlightStyle -> "DehighlightHide"。第二种方法在该图的 future 变体中使用该图的VertexCoordinates。

    我们将分别讨论删除和添加,因为它们涉及的方法略有不同。

    [P.S. :我对答案进行了几处编辑,以使其更清楚。]

    首先是一些数据:

    edges={1\[UndirectedEdge]8,1\[UndirectedEdge]11,1\[UndirectedEdge]18,1\[UndirectedEdge]19,1\[UndirectedEdge]21,1\[UndirectedEdge]25,1\[UndirectedEdge]26,1\[UndirectedEdge]34,1\[UndirectedEdge]37,1\[UndirectedEdge]38,4\[UndirectedEdge]11,4\[UndirectedEdge]12,4\[UndirectedEdge]26,4\[UndirectedEdge]27,4\[UndirectedEdge]47,4\[UndirectedEdge]56,4\[UndirectedEdge]57,4\[UndirectedEdge]96,4\[UndirectedEdge]117,5\[UndirectedEdge]11,5\[UndirectedEdge]18,7\[UndirectedEdge]21,7\[UndirectedEdge]25,7\[UndirectedEdge]34,7\[UndirectedEdge]55,7\[UndirectedEdge]76,8\[UndirectedEdge]11,26\[UndirectedEdge]29,26\[UndirectedEdge]49,26\[UndirectedEdge]52,26\[UndirectedEdge]111,27\[UndirectedEdge]28,27\[UndirectedEdge]51,42\[UndirectedEdge]47,49\[UndirectedEdge]97,51\[UndirectedEdge]96}

    这是初始图:
    g = Graph[edges, VertexLabels -> "Name", ImagePadding -> 10, 
    ImageSize -> 500]

    在不更改图形整体外观的情况下“删除”图形边缘。

    让我们开始删除位于图形中心的边(4,11)。 remainingEdgesAndVertices包含所有顶点和初始边,但边(4,11)除外。
    remainingEdgesAndVertices = 
    Join[VertexList[g], Complement[EdgeList[g], {4 \[UndirectedEdge] 11}]]

    让我们“删除”(即隐藏)边缘(4,11):
     HighlightGraph[g, remainingEdgesAndVertices, VertexLabels -> "Name", 
    ImagePadding -> 10, GraphHighlightStyle -> "DehighlightHide",
    ImageSize -> 500]

    如果我们实际上删除了边(4,11),则该图将彻底改变其外观。
     Graph[Complement[edges, {4 \[UndirectedEdge] 11}], 
    VertexLabels -> "Name", ImagePadding -> 10, ImageSize -> 500]

    在不更改图形整体外观的情况下“添加”图形边缘。

    添加图形边缘稍微更具挑战性。我想到两种方法。此处使用的方法向后工作。您首先以隐藏形式包括新边缘,然后再发现它。带有隐藏的“待添加”边缘的初始图形的布局将类似于带有"new"边缘的图形的布局。原因是:它们实际上是同一张图:但是它们显示的边数不同。
    g2 = Graph[Append[edges, 42 \[UndirectedEdge] 37], 
    VertexLabels -> "Name", ImagePadding -> 10, ImageSize -> 500]

    HighlightGraph[g2,
    Join[Complement[EdgeList[g2], {42 \[UndirectedEdge] 37}],
    VertexList[g2]], VertexLabels -> "Name", ImagePadding -> 10,
    GraphHighlightStyle -> "DehighlightHide"]

    现在显示添加了“新边缘”的图形。

    这看起来与图1截然不同。但这似乎是图4的自然扩展。

    动态添加新的顶点和边

    还有另一种在保持整体外观的同时添加边缘(和顶点)的方法。这是受到舍尔德在回应中所写内容的启发。

    让我们为将来的顶点99保留点{0,0}。我们只需将该点添加到g2的 VertexCoordinates中:
    vc = VertexCoordinates -> 
    Append[AbsoluteOptions[g2, VertexCoordinates][[2]], {0, 0}]

    现在,让我们看一下它的外观。 g3只是具有附加顶点(999)和边(4,99)的g2。
    g3 = Graph[Append[EdgeList [g2], 4 \[UndirectedEdge] 999], vc, 
    VertexLabels -> "Name", ImagePadding -> 10,
    GraphHighlightStyle -> "DehighlightHide", ImageSize -> 500]

    此过程使我们可以在前进时添加新的边和顶点。但是需要进行反复试验才能确保新顶点位于适当的位置。

    仅添加另一条边(没有新顶点)要容易得多:只需添加新边并使用先前图形中的 VertexCoordinates即可。

    您应该能够使用相同的方法(使用相同的 VertexCoordinates)从图形中删除边。

    关于wolfram-mathematica - 稍作修改后重新布局图,同时保留原始布局的特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6550127/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com