Création d'un graphique avec des bords de différentes couleurs dans Mathematica
-
29-09-2019 - |
Question
Je veux créer un graphique (Théorie des graphes) où certains bords ont une couleur différente à d'autres bords, qui seraient utilisés pour mettre en évidence un chemin dans le graphe d'un sommet à l'autre.
Voici quelques exemples qui ont des bords colorés http://demonstrations.wolfram.com/AGraphTheoryInterpretationOfTheSumOfTheFirstNIntegers/ et http://demonstrations.wolfram.com/Ramsey336/ . Je regardais le code source pour ces derniers mais ces solutions semblent compliquées. J'ai besoin d'un exemple simple à travailler. Je pense que je dois utiliser le EdgeRenderingFunction comme l'une des options pour GraphPlot
.
De plus en documentation EdgeRenderingFunction dans « Plus Information » partie il dit:
Cela semble utile, mais il n'y a malheureusement pas codé exemples pour essayer.
La prise que très littéralement j'ai essayé des choses comme
GraphPlot [{1 -> 2, 2 -> 3, 3 -> 4, 4 -> 1, 2 -> 4, 4 -> 5, 4 -> 6}, VertexLabeling -> True,
EdgeRenderingFunction -> g [{1, 2}, {1, 2}, rouge]]
Mais cela ne fonctionnerait pas. Il faudra quelque chose de plus intelligent que cela.
La solution
Voici un exemple qui illustre comment automatiser la mise en évidence d'un chemin particulier par un graphique.
Voici un graphique stupide, spécifié par une liste de règles de bord:
edges = Table[i -> Mod[1 + i^2, 10], {i, 0, 9}];
GraphPlot[edges, VertexLabeling -> True]
Voici un chemin à travers le graphique que nous aimerions souligner.
path = {0, 1, 2, 5, 6, 7, 0};
La partition Let le chemin dans les bords, ce qui représente le fait que nous voulons souligner l'indépendance de bord de son orientation.
edgesToHighlight = Partition[path, 2, 1];
edgesToHighlight = Join[edgesToHighlight,
Reverse /@ edgesToHighlight];
Nous écrivons un EdgeRenderingFunction
qui rend un avantage dans l'un des deux styles, en fonction pas que ce soit dans notre liste ou non.
erf[pts_, edge_, ___] := If[MemberQ[edgesToHighlight, edge],
{Thick, Black, Arrow[pts, 0.1]}, {Darker[Red], Line[pts]}];
Enfin, nous affichons le résultat.
GraphPlot[edges, EdgeRenderingFunction -> erf,
VertexLabeling -> True]
Autres conseils
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]}
&)
]
La fonction de rendu est une fonction de rappel, qui prend 3 arguments. La 1ère est la liste des coordonnées de la ligne, la 2e est les sommets du bord, et le 3e est l'étiquette du bord.
Dans Mathematica vous pouvez créer une fonction anonyme avec (f[#1,#2,#3,...] &)
.