Создание графика с ребрами разных цветов в Mathematica - PullRequest
5 голосов
/ 09 октября 2010

Я хочу создать граф (Теория графов), в котором определенные ребра имеют цвет, отличный от других ребер, который будет использоваться для выделения пути в графе от одной вершины к другой.

Вот несколько примеров с разноцветными краями http://demonstrations.wolfram.com/AGraphTheoryInterpretationOfTheSumOfTheFirstNIntegers/ и http://demonstrations.wolfram.com/Ramsey336/. Я посмотрел исходный код для них, но эти решения кажутся сложными.Мне нужен простой пример для работы.Я считаю, что мне нужно использовать EdgeRenderingFunction в качестве одного из параметров для GraphPlot.

Дополнительно в документации EdgeRenderingFunction в разделе «Дополнительная информация» написано:

Mathematica graphics

Это выглядит полезным, но, к сожалению, нет кодированных примеровчтобы попробовать.

Принимая это буквально, я попробовал что-то вроде

GraphPlot [{1 -> 2, 2 -> 3, 3 -> 4, 4 -> 1, 2-> 4, 4 -> 5, 4 -> 6}, VertexLabeling -> True,
EdgeRenderingFunction -> g [{1, 2}, {1, 2}, красный]]

Но это не сработает.Это займет что-то более умное, чем это.

Ответы [ 2 ]

6 голосов
/ 10 октября 2010

Вот пример, который иллюстрирует, как автоматизировать выделение определенного пути через график.

Вот глупый граф, определенный списком правил ребер:

edges = Table[i -> Mod[1 + i^2, 10], {i, 0, 9}];
GraphPlot[edges, VertexLabeling -> True]

Mathematica graphics

Вот путь через график, который мы хотели бы выделить.

path = {0, 1, 2, 5, 6, 7, 0};

Давайте разделим путь на ребра, учитывая тот факт, что мы хотим выделить ребро независимо от его ориентации.

edgesToHighlight = Partition[path, 2, 1];
edgesToHighlight = Join[edgesToHighlight,
    Reverse /@ edgesToHighlight];

Мы пишем EdgeRenderingFunction, который отображает ребро в одном из двух стилей, в зависимости от того, находится он в нашем списке или нет.

erf[pts_, edge_, ___] := If[MemberQ[edgesToHighlight, edge],
    {Thick, Black, Arrow[pts, 0.1]}, {Darker[Red], Line[pts]}];

Наконец, мы показываем результат.

GraphPlot[edges, EdgeRenderingFunction -> erf,
    VertexLabeling -> True]

Mathematica graphics

1 голос
/ 09 октября 2010
GraphPlot[
 {1 -> 2, 2 -> 3, 3 -> 4, 4 -> 1, 2 -> 4, 4 -> 5, 4 -> 6}, 
 VertexLabeling -> True, 
 EdgeRenderingFunction -> (
    {If[#2 == {1, 2}, Red, Black], 
     Line[#1]}
  &)
]

Mathematica graphics

Функция рендеринга является функцией обратного вызова, которая принимает 3 аргумента. 1-й - список координат линии, 2-й - вершины ребра, а 3-й - метка ребра.

В Mathematica вы можете создать анонимную функцию с помощью (f[#1,#2,#3,...] &).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...