2012-01-19 18 views
7

Estoy usando GraphPlot para dibujar gráficos dirigidos con aproximadamente 100 vértices. Estoy reemplazando cada vértice con una pequeña imagen rectangular o cuadrada mediante la definición de VertexRenderingFunction. Las imágenes a menudo se superponen. ¿Hay alguna manera de hacer que Mathematica espacie los vértices más separados para evitar que se superpongan?En Mathematica. Cuando utilizo imágenes como vértices en GraphPlot, ¿cómo evito que las imágenes se superpongan?

He intentado varias opciones obvias para 'Método' ("SpringElectricalEmbedding", "SpringEmbedding", "HighDimensionEmbedding", "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

Bienvenido a Stackoverflow. ¿Por qué no incluye el código que usó (o algunos ejemplos) para que podamos examinar el problema que está teniendo? – DavidC

+0

Gracias por los comentarios, estoy buscando algunas de las sugerencias que ha hecho. He agregado un ejemplo que puede ayudar a aclarar mi pregunta. – Martijn

+0

¿Está planeando tener imágenes idénticas para cada uno de los vértices? ¿O algunos vértices se verán diferentes? (Tengo una razón para preguntar). – DavidC

Respuesta

3

Editar [I comenzó de nuevo, basado en el ejemplo que diste]:

Usando su trans y image usted podría intentar: aparecerán

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

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

Las imágenes en la información sobre herramientas cuando pasa el mouse sobre cada vértice. Podría usar diferentes imágenes para diferentes etiquetas de vértices si lo desea; solo usa una lista de reglas.

La imagen siguiente muestra cómo se ve (sin la información sobre herramientas). Haga clic en link para ver cómo funciona con la información sobre herramientas.

graph

+0

¡Esa es una manera muy buena de hacerlo! No he usado información sobre herramientas antes. Pero estoy imprimiendo las imágenes para ponerlas en mi tesis, me gustaría poder ver todas las imágenes a la vez. – Martijn

+0

Sí, la información sobre herramientas no aparecerá en el papel. Entonces parece que su gráfica debe dibujarse un poco más grande de lo que originalmente se imaginó. No hay ninguna razón, a priori, por la que no puedas usar una página completa para mostrar una figura con subtítulo, ¿verdad? En esa escala, su solución actual, a través de 'GraphPlot' debería funcionar. Si necesitaba aún más control sobre el renderizado, usaría OmniGraffle Pro (para Mac) o Visio. Para una solución única, esto funcionará. Si tiene varias figuras con 100 vértices, la cantidad de trabajo será prohibitiva. – DavidC

+0

Tengo varios de estos tipos de gráficos. Ya he editado una gran parte usando ipe, pero lleva bastante tiempo. Esperaba que hubiera una solución genérica. Un pequeño problema al escalar las figuras es que al cambiar el tamaño de las figuras arrastrando una esquina de la imagen, el tamaño de las flechas en la escala de bordes dirigidos y una o dos imágenes pueden superponerse requiriendo alguna edición manual (que ya es mejor) , pero sería bueno tener una solución perfecta donde todo sucede más o menos automáticamente. ¡Gracias por toda su contribución hasta ahora! Aprendí un par de trucos nuevos. – Martijn

Cuestiones relacionadas