2011-09-28 18 views
6

Sto provando a creare un LayeredGraphPlot in cui alcuni nodi si connettono ad altri nodi, come un albero. Mi piacerebbe avere la libertà di scegliere lo spessore, il colore, la presenza o l'assenza dell'etichettatura di ciascun bordo.Guida EdgeRenderingFunction e VertexRenderingFunction

Vorrei anche avere la libertà di visualizzare alcuni nomi di vertici e visualizzare alcuni vertici come "punti". Non riesco a capire come EdgeRenderingFunction e VertexRenderingFunction mi permettano di farlo.

Sono nuovo di matematica. Ho fatto clic su ulteriori informazioni sulla pagina di aiuto di Wolfram ma sembra avere una descrizione vaga e una sintassi non precisa, seguita da alcuni esempi carini ma inutili (per me) (Rispetto al MATLAB in matematica dove la guida fornisce una sintassi precisa .. almeno nella mia mente).
Ho consultato circa 10 libri di matematica (Smith e Blachman, matematico demistificato .. ecc. Ecc.) Ma sembrano tutti coprire superficialmente la funzione con uno o due esempi e non fornire la sintassi più generale.

Qualcuno può aiutare con questo e mi piacerebbe anche consigli su come imparare la matematica? Sono un ragazzo intelligente e non dovrei avere così tanti problemi a imparare a usare i comandi.

LayeredGraphPlot [{1-> 2,1-> 3,2-> 4,3-> 5,3-> 6}]

Così, per esempio, mi piacerebbe:

  1. sopprimere ogni i nomi dei vertici tranne vertici 4,5 e 6.
  2. colori come blu e spessore dei bordi da 3-> 6, 2-> 4 e 1-> 3
  3. tutti gli altri bordi di essere rosso e sottile
+1

Credo che la vostra inesperienza con Mathematica è quello che si sta alzando qui. I file di aiuto sono grandi quando si ha familiarità con il sistema, ma ammettiamo che non forniscono molto per aiutare un principiante a velocizzare rapidamente; l'unico modo affidabile che ho trovato per familiarizzare con Mathematica è di usarlo il più possibile. Vedrò se riesco a scrivere qualcosa quando avrò tempo. –

+0

Hai aperto la casella "Ulteriori informazioni" proprio sotto la sezione della sintassi, vero? Basta controllare il numero –

+0

Sjoerd: Ho cercato "MoreInfo" e poi ho cercato la sintassi delle funzioni e poi non ho trovato una definizione di funzione che assomigliasse a qualcosa di simile a quella utilizzata negli esempi di LayeredG ... – Amatya

risposta

7

VertexRenderingFunction e EdgeRenderingFunction consentono di assumere un controllo esplicito sul modo in cui i vertici e i bordi vengono disegnati nel grafico. Si prevede che entrambe le funzioni restituiscano una direttiva grafica simbolica (o un elenco di tali direttive) valida per il comando Graphics.

Iniziamo con VertexRenderingFunction. Definiremo una nuova funzione chiamata drawVertex. Un VertexRenderingFunction viene chiamato con due argomenti: la posizione del vertice (come coppia di coordinate X/Y) e il nome del vertice.

drawVertex[position_, vertex:(4 | 5 | 6)] := 
    Inset[Framed[vertex, Background -> LightMagenta], position] 

drawVertex[position_, _] := 
    {PointSize[Medium], Blue, Point[position]} 

Due definizioni sono previste per drawVertex.Il primo è applicabile solo ai vertici 4 o 5 o 6. Disegna quei vertici come etichette incorniciate. La seconda definizione è applicabile a tutti gli altri vertici e disegna semplici punti blu.

Ora per un EdgeRenderingFunction denominato drawEdge. Alla funzione verranno passati tre argomenti: i punti finali del bordo, una lista dei vertici sorgente e bersaglio del bordo e l'etichetta per il bordo (se presente). Nel nostro caso, tutti i bordi saranno disegnati come frecce ma il colore e lo spessore varieranno a seconda del bordo. La funzione di supporto edgeStyle è introdotta per catturare queste differenze:

drawEdge[ends_, fromTo_, label_] := 
    Join[edgeStyle[fromTo], {Arrowheads[{{Automatic, 0.5}}], Arrow[ends]}] 

edgeStyle[{3, 6} | {2, 4} | {1, 3}] := 
    {Blue, Thick} 

edgeStyle[_] := 
    {Red, Thin} 

Con queste definizioni in atto, possiamo ora utilizzarli in combinazione con LayeredGraphPlot per produrre un diagramma personalizzato:

LayeredGraphPlot[{1 -> 2, 1 -> 3, 2 -> 4, 3 -> 5, 3 -> 6}, 
    VertexRenderingFunction -> drawVertex, EdgeRenderingFunction -> drawEdge ] 

layered graph

+0

Oh uomo! (o donna) ... Grazie mille! È stato un lungo cammino nel chiarire il quadro per me. Grazie a tutti! – Amatya

+0

Grazie ancora Wreach! Ora ho l'immagine di come creare le mie funzioni. Penso che questo mi aiuterà in molte molte altre parti. Ora la sezione More Info ha più senso. Apprezzo molto il vostro aiuto. Grazie! – Amatya

+0

Ciao WReach, ho imitato il tuo codice e prodotto qualcosa di simile a quello che volevo produrre e l'ho postato come risposta perché non sapevo come pubblicarlo nel commento. Grazie per l'aiuto. Il tuo esempio dettagliato mi ha davvero aiutato a capire la struttura in una certa misura. Grazie – Amatya

3
LayeredGraphPlot[ 
{1 -> 2, 1 -> 3, 2 -> 4, 3 -> 5, 3 -> 6}, 
VertexRenderingFunction -> 
    (If[Intersection[{4, 5, 6}, {#2}] != {}, 
      {White, EdgeForm[Black], Disk[#, .1], Black, Text[#2, #1]}, 
      {PointSize[Large], Point[#1]}] &), 
EdgeRenderingFunction -> 
    (If[Intersection[{{3, 6}, {2, 4}, {1, 3}}, {#2}] != {}, 
      {Blue, Thick, Line[#1]}, 
      {Red, Line[#1]}] &) 
] 

enter image description here

La sintassi di Mathematica è scoraggiante a prima vista. Quasi tutti gli strumenti potenti sono.
Penso che i brevi frammenti forniti qui in StackOverflow come risposte ai nuovi utenti Mma siano un buon punto di partenza per i primi passi. Si prega di notare che ci sono anche domande avanzate e molto più difficili pubblicate.

Mathematica non è inteso per l'utente occasionale. Se non hai intenzione di investire un po 'di tempo nell'apprendimento e di abituarti, ti suggerisco di provare un altro strumento.

Infine, la funzione non è trattata in modo approfondito nel sistema di guida, semplicemente perché si tratta di un cugino di GraphPlot[], la cui pagina di aiuto è la radice di tutte le ricerche di guida del grafico di Graph ... [].

0

Ho imitato il tuo codice e sono riuscito a produrre qualcosa di molto vicino a ciò che volevo davvero. Grazie mille per il vostro aiuto!

enter image description here

{drawVertex[position_, 
    vertex : (1111 | 1112 | 1121 | 1122 | 1211 | 1212 | 1221 | 1222)] := 
    Inset[Framed[ 
    Text[If[vertex == 1111, "80,70", 
    If[vertex == 1112, "50,60", 
    If[vertex == 1121, "105,50", If[vertex == 1122, "70,55", 
    If[vertex == 1211, "70,40", 
    If[vertex == 1212, "90,50", 
    If[vertex == 1221, "85,60", "40,50"]]]]]]]], 
    Background -> White], position] 
    drawVertex[position_, _] := {PointSize[Medium], Blue, Point[position]} 
    drawEdge[ends_, fromTo_, 
    label_] := {Join[ 
    edgeStyle[fromTo], {Arrowheads[{{Automatic, 1}}], Arrow[ends]}], 
    Text[label, Mean[ends]]} 

    edgeStyle[{1, 11} | {11, 111} | {111, 1111}] := {Blue, Thick} 

    edgeStyle[_] := {Red, Thin} 
    LayeredGraphPlot[{{1 -> 11, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"1\", \"L\"}]]\)"}, {1 -> 12, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"1\", \"R\"}]]\)"}, {11 -> 111, 
    "\!\(\*SubscriptBox[\"H\", \"L\"]\)"}, {11 -> 112, 
    "\!\(\*SubscriptBox[\"H\", \"H\"]\)"}, {12 -> 121, 
    "\!\(\*SubscriptBox[\"H\", \"L\"]\)"}, {12 -> 122, 
    "\!\(\*SubscriptBox[\"H\", \"H\"]\)"}, {111 -> 1111, 
    "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"0\", \"L\"}]]\)"}, {111 -> 1112, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"0\", \"H\"}]]\)"}, {112 -> 1121, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"0\", \"L\"}]]\)"}, {112 -> 1122, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"0\", \"H\"}]]\)"}, {121 -> 1211, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"0\", \"L\"}]]\)"}, {121 -> 1212, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"0\", \"H\"}]]\)"}, {122 -> 1221, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"0\", \"L\"}]]\)"}, {122 -> 1222, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"0\", \"H\"}]]\)"}}, EdgeRenderingFunction -> drawEdge, 
    VertexRenderingFunction -> drawVertex]}