2010-10-09 11 views
5

Chcę utworzyć wykres (teorię wykresu), w którym niektóre krawędzie mają inny kolor niż inne krawędzie, które będą używane do wyróżnienia ścieżki na wykresie z jednego wierzchołka na drugi .Tworzenie wykresu z krawędziami o różnych kolorach w Mathematica

Oto kilka przykładów, które mają różne kolorowe krawędzie http://demonstrations.wolfram.com/AGraphTheoryInterpretationOfTheSumOfTheFirstNIntegers/ i http://demonstrations.wolfram.com/Ramsey336/. Przyjrzałem się kodowi źródłowemu, ale te rozwiązania wydają się skomplikowane. Potrzebuję prostego przykładu do pracy. Sądzę, że muszę użyć EdgeRenderingFunction jako jednej z opcji dla GraphPlot.

Dodatkowo pod EdgeRenderingFunction dokumentacji w „Więcej informacji” część mówi:

Mathematica graphics

Wygląda to przydatne, ale niestety nie ma zakodowane przykłady spróbować.

Biorąc to bardzo dosłownie, że próbował rzeczy jak

GraphPlot [{1 -> 2, 2 -> 3, 3 -> 4, 4 -> 1 2 -> 4, 4 -> 5, 4 -> 6} VertexLabeling -> prawda
EdgeRenderingFunction -> g [{1, 2}, {1 2}, Czerwony]]

jednak, że nie działa. To zajmie coś bardziej sprytnego.

Odpowiedz

6

Oto przykład ilustrujący sposób zautomatyzowania podświetlania określonej ścieżki za pomocą wykresu.

Oto głupie wykres, określony przez liście reguł brzegowych:

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

Mathematica graphics

Oto ścieżka przez wykresu chcielibyśmy podkreślić.

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

Niech podzielić ścieżkę na krawędziach, co stanowi fakt, że chcemy, aby podświetlić niezależnie krawędzi jego orientacji.

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

Piszemy o EdgeRenderingFunction który renderuje przewagę w jednym z dwóch stylów, nie zależnie czy to na naszej liście, czy nie.

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

Na koniec wyświetlamy wynik.

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

Mathematica graphics

+0

prosty, elegancki i ogólny +1 –

+0

@ Mark McClure: Mathematica znów mnie zaskakuje. Jak można wywołać funkcję 'erf' bez przekazywania jakichkolwiek argumentów? Mimo że utworzyłeś 3 parametry w definicji funkcji, zakładam, że automatycznie "znajdzie" je w bieżącym kontekście? – dbjohn

+0

@dbjohn Nie nazwałem tej funkcji; Po prostu mówię GraphPlot, jaką funkcję wywołać, gdy rysuje krawędzie. Oto podobny przykład: Wybierz [Zakres [9], EvenQ]. W tym przykładzie wartość EvenQ jest przekazywana jako argument do Select. Wybierz, a następnie wybiera tylko te liczby całkowite n, dla których EvenQ [n] zwraca True. –

1
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

Funkcja renderowania jest funkcją zwrotna, co trwa około 3 argumentów. Pierwsza to lista współrzędnych linii, druga to wierzchołki krawędzi, a trzecia to etykieta krawędzi.

W Mathematica można utworzyć anonimową funkcję z (f[#1,#2,#3,...] &).

+0

To działa na jednej krawędzi. Ale przypuśćmy, że chcę pokolorować ścieżkę, która obejmuje więcej niż jedną krawędź i wierzchołek? Próbowałem modyfikacji: 'Jeśli [# 2 == {1, 2, 3, 4, 5} ...' i 'Jeśli [# 2 == {{1, 2}, {3, 4}} ... 'ale nie działało. Jakieś pomysły? – dbjohn

+0

@dbjohn: Patrz [MemberQ] (http://reference.wolfram.com/mathematica/ref/MemberQ.html). – kennytm

+0

Sugerujesz, że używam MemberQ jak: 'Jeśli [MemberQ [# 2, {2, 3, 4, 5}], Red ...' to znaczy, jeśli wierzchołki x, y, z są w elementach listy wszystkich wierzchołków zabarwiają je na czerwono? Ten kod nie działa, MemberQ nie może wziąć listy jako swojego drugiego argumentu. Potrzebuję bardziej wyraźnego kierunku. – dbjohn

Powiązane problemy