2012-01-19 15 views
7

Sto usando GraphPlot per disegnare grafici diretti con circa 100 vertici. Sto sostituendo ogni vertice con una piccola immagine rettangolare o quadrata definendo la funzione VertexRendering. Le immagini si sovrappongono spesso. C'è un modo per far sì che Mathematica distanzia ulteriormente i vertici per evitare che si sovrappongano?In Mathematica. Quando si usano le immagini come vertici in GraphPlot, come posso evitare che le immagini si sovrappongano?

Ho provato le varie opzioni ovvie per "Metodo" ("SpringElectricalEmbedding", "SpringEmbedding", "HighDimensionalEmbedding", "CircularEmbedding", "RandomEmbedding", "LinearEmbedding").

trans = {1 -> 1, 2 -> 1, 3 -> 1, 4 -> 1, 5 -> 1, 6 -> 1, 7 -> 1, 
8 -> 1, 9 -> 1, 10 -> 1, 11 -> 1, 12 -> 1, 13 -> 1, 14 -> 1, 
15 -> 1, 16 -> 1, 17 -> 1, 18 -> 13, 19 -> 1, 20 -> 13, 21 -> 13, 
22 -> 70, 23 -> 1, 24 -> 1, 25 -> 1, 26 -> 1, 27 -> 13, 28 -> 13, 
29 -> 1, 30 -> 13, 31 -> 13, 32 -> 1, 33 -> 19, 34 -> 70, 35 -> 70, 
36 -> 1, 37 -> 1, 38 -> 1, 39 -> 39, 40 -> 13, 41 -> 2, 42 -> 13, 
43 -> 1, 44 -> 2, 45 -> 1, 46 -> 52, 47 -> 2, 48 -> 68, 49 -> 49, 
50 -> 19, 51 -> 78, 52 -> 1, 53 -> 1, 54 -> 39, 55 -> 13, 56 -> 56, 
57 -> 13, 58 -> 13, 59 -> 1, 60 -> 36, 61 -> 1, 62 -> 52, 63 -> 2, 
6 4 -> 68, 65 -> 19, 66 -> 56, 67 -> 4, 68 -> 76, 69 -> 19, 
70 -> 78, 71 -> 1, 72 -> 39, 73 -> 52, 74 -> 56, 75 -> 23, 
76 -> 76, 77 -> 56, 78 -> 78}; 

image = {{1, 0, 0, 0, 0}, {0, 1, 0, 0, 0}}; 

GraphPlot[trans, DirectedEdges -> True, VertexLabeling -> True, 
VertexRenderingFunction -> (Inset[ 
ArrayPlot[image, ImageSize -> 15, Mesh -> True], #1] &)] 

Output

+2

Benvenuti in Stackoverflow. Perché non includi il codice che hai usato (o alcuni esempi di esso) in modo da poter esaminare il problema che stai riscontrando. – DavidC

+0

Grazie per il feedback, sto esaminando alcuni dei suggerimenti che hai fatto. Ho aggiunto un esempio che può aiutare a chiarire la mia domanda. – Martijn

+0

Hai intenzione di avere immagini identiche per ciascuno dei vertici? O alcuni vertici sembrano diversi? (Ho una ragione per chiederlo). – DavidC

risposta

3

Edit [ho iniziato sopra, in base alla esempio che ha dato]:

Utilizzando il trans e image si potrebbe provare: appariranno

p = ArrayPlot[image, ImageSize -> 35, Mesh -> True]; 

Graph[trans, DirectedEdges -> True, VertexLabels -> Placed[p, Tooltip], 
    ImagePadding -> 10, ImageSize -> 500] 

Le immagini in tooltip quando si passa il mouse su ciascun vertice. Potresti usare immagini diverse per etichette di vertici diverse, se lo desideri; basta usare un elenco di regole.

L'immagine seguente mostra l'aspetto (senza i suggerimenti). Fare clic su link per vedere come funziona con i suggerimenti.

graph

+0

Questo è un modo molto carino per farlo! Non ho mai usato i tooltip. Ma sto stampando le immagini da inserire nella mia tesi, vorrei poter vedere tutte le immagini contemporaneamente. – Martijn

+0

Sì, i suggerimenti non verranno visualizzati sulla carta. Quindi sembra che il tuo grafico possa aver bisogno di essere disegnato un po 'più grande di quanto inizialmente previsto. Non c'è motivo, a priori, perché non è possibile utilizzare una pagina intera per visualizzare una figura con didascalia, giusto? A quella scala la tua soluzione attuale, tramite 'GraphPlot' dovrebbe funzionare. Se avessi bisogno di un controllo ancora maggiore sul rendering, userei OmniGraffle Pro (per un Mac) o Visio. Per una soluzione una tantum, funzionerà. Se hai più figure con 100 vertici, la quantità di lavoro sarà proibitiva. – DavidC

+0

Ho un numero di questi tipi di grafici. Una grande parte che ho già modificato usando ipe, ma richiede parecchio tempo. Speravo ci fosse una soluzione generica. Un piccolo problema durante il ridimensionamento delle figure è che quando ridimensionate le figure trascinando un angolo dell'immagine, la dimensione delle frecce sui bordi diretti ridimensiona e una o due immagini possono ancora sovrapporsi richiedendo alcune modifiche manuali (che è già meglio) , ma sarebbe bello avere una soluzione perfetta dove tutto avviene più o meno automaticamente. Grazie per tutti i tuoi suggerimenti finora! Ho imparato un paio di nuovi trucchi. – Martijn

Problemi correlati