Вот два основных подхода к изменению графиков в MMA 8.0. Первый основан на HighlightGraph
и, в частности, GraphHighlightStyle -> "DehighlightHide"
. Второй подход использует 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]
«Добавление» края графа без изменения общего вида графика.
Добавление ребра графа немного сложнее. Есть два способа, которые приходят на ум. Используемый здесь метод работает в обратном направлении. Вы включаете новый край сначала в скрытом виде, а затем раскрываете его позже. Исходный граф со скрытым ребром «для добавления» будет иметь компоновку, аналогичную схеме графа с «новым» ребром. Причина в следующем: на самом деле они представляют собой один и тот же график: однако они показывают разное количество ребер.
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.
Добавление новых вершин и ребер на лету
Существует еще один способ добавления ребер (и вершин) при сохранении общего вида. Это было вдохновлено чем-то, что Сьорд написал в своем ответе.
Давайте зарезервируем точку {0,0} для будущей вершины 99. Мы просто добавим эту точку к VertexCoordinates
из g2:
vc = VertexCoordinates ->
Append[AbsoluteOptions[g2, VertexCoordinates][[2]], {0, 0}]
Теперь посмотрим, как это выглядит. g3 - это просто g2 с дополнительной вершиной (999) и ребром (4,99).
g3 = Graph[Append[EdgeList [g2], 4 \[UndirectedEdge] 999], vc,
VertexLabels -> "Name", ImagePadding -> 10,
GraphHighlightStyle -> "DehighlightHide", ImageSize -> 500]
Эта процедура позволяет нам добавлять новые ребра и вершины по мере продвижения вперед. Но для того, чтобы новые вершины были расположены в подходящем положении, потребуются некоторые пробные и ошибочные действия.
Добавить только другое ребро (без новой вершины) гораздо проще: просто добавьте новое ребро и используйте VertexCoordinates
из предыдущего графа.
Вы должны иметь возможность удалять ребра из графика, используя тот же подход (используя тот же VertexCoordinates
).