2010-10-09 20 views
5

Voglio creare un grafico (Teoria dei grafi) in cui determinati bordi hanno un colore diverso rispetto agli altri bordi, che verrebbero utilizzati per evidenziare un tracciato nel grafico da un vertice all'altro .Creazione di un grafico con bordi di colori diversi in Mathematica

Ecco alcuni esempi con diversi bordi colorati http://demonstrations.wolfram.com/AGraphTheoryInterpretationOfTheSumOfTheFirstNIntegers/ e http://demonstrations.wolfram.com/Ramsey336/. Ho guardato il codice sorgente per questi, ma quelle soluzioni sembrano complicate. Ho bisogno di un semplice esempio da cui lavorare. Ritengo necessario utilizzare EdgeRenderingFunction come una delle opzioni per GraphPlot.

Inoltre sotto EdgeRenderingFunction documentazione in parte "Maggiori informazioni" si dice:

Mathematica graphics

Questo sembra utile, ma purtroppo non ci sono esempi codificati da provare.

Prendendo quel letteralmente ho provato cose come

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

Ma che non avrebbe funzionato. Ci vorrà qualcosa di più intelligente di così.

risposta

6

Ecco un esempio che illustra come automatizzare l'evidenziazione di un particolare percorso attraverso un grafico.

Ecco un grafico stupido, specificata da un elenco di regole bordo:

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

Mathematica graphics

Ecco un percorso attraverso il grafico che vorremmo mettere in evidenza.

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

Diamo partizionare il percorso in bordi, la contabilità per il fatto che vogliamo evidenziare indipendente bordo del suo orientamento.

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

Scriviamo un EdgeRenderingFunction che rende un vantaggio in uno dei due stili, a seconda che si tratti di non nella nostra lista oppure no.

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

Infine, viene visualizzato il risultato.

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

Mathematica graphics

+0

semplice, elegante e generale +1 –

+0

@ Mark McClure: Mathematica mi sorprende ancora. Come puoi chiamare la funzione 'erf' senza passare alcun argomento ad essa? Anche se hai creato 3 parametri nella definizione della funzione, presumo che li "trovi" automaticamente nel contesto corrente? – dbjohn

+0

@dbjohn Non ho chiamato la funzione; Sto semplicemente dicendo a GraphPlot quale funzione chiamare quando disegna i bordi. Ecco un esempio simile: selezionare [Range [9], EvenQ]. In questo esempio, EvenQ viene passato come argomento a Seleziona. Seleziona quindi seleziona solo quei numeri interi n per i quali EvenQ [n] restituisce 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

La funzione di rendering è una funzione callback che prende 3 argomenti. Il primo è l'elenco delle coordinate della linea, il 2 ° è il vertice del bordo e il terzo è l'etichetta del bordo.

In Mathematica è possibile creare una funzione anonima con (f[#1,#2,#3,...] &).

+0

che funziona per un bordo. Ma supponiamo che voglio colorare un percorso che copre più di un bordo e vertice? Ho provato la modifica: 'Se [# 2 == {1, 2, 3, 4, 5} ...' e 'Se [# 2 == {{1, 2}, {3, 4}} ... 'ma non ha funzionato. Qualche idea? – dbjohn

+0

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

+0

Si sta suggerendo di usare MemberQ come: 'Se [MemberQ [# 2, {2, 3, 4, 5}], Rosso ...' vale a dire se i vertici x, y, z sono in membri della lista di tutti i vertici li colora di rosso? Quel codice non funziona, MemberQ non può prendere una lista come secondo argomento. Avrò bisogno di una direzione più esplicita. – dbjohn