6

¿Hay alguna manera sencilla de hacer lo siguiente en Mathematica 8?Reorganizar el gráfico después de una pequeña modificación conservando las características del diseño original

  1. Construya un gráfico y visualícelo utilizando un diseño de gráfico.
  2. Modifique el gráfico ligeramente (por ejemplo, agregue o elimine un borde o un vértice).
  3. Vuelva a calcular el diseño comenzando desde el diseño original, de forma tal que la "forma" del objeto se conserve más o menos. P.ej. vuelva a ejecutar un algoritmo de diseño de resorte eléctrico que comience con las coordenadas del diseño anterior.

Si el gráfico no ha cambiado entre dos pantallas, la disposición no debería cambiar tampoco (o solo mínimamente). Usar la pantalla del nuevo Graph o GraphPlot son ambos aceptables.

EDITAR: En esencia, necesito diseños similares para gráficos similares. Siempre obtengo gráficos similares modificando uno existente, que ya puede haber sido presentado, pero cualquier solución genérica es aceptable.

EDIT 2: Aquí hay un ejemplo de dónde este tipo de cosas es útil. Vaya a http://ccl.northwestern.edu/netlogo/models/GiantComponent y haga clic en "Ejecutar en el navegador" (requiere Java). Haga clic en Configurar y luego en Ir. Puedes ver el gráfico evolucionar. Si hacemos esto en Mathematica, cada uno de los gráficos sucesivos se verá completamente diferente, y será difícil ver que es el mismo gráfico el que está evolucionando. En varias aplicaciones, es bastante útil poder visualizar pequeños cambios en el gráfico como tal. Pero si se realizan muchos cambios sucesivos, entonces es necesario volver a calcular el diseño, simplemente desvanecerse o resaltar bordes no es suficiente. Nuevamente, esto es solo un ejemplo: no estoy tratando de usar Mathematica para animar un gráfico, o para visualizar el surgimiento del componente gigante.

+2

Si el problema es la otra manera, es decir, la eliminación de algunos vértices y gráficos a partir de un gráfico y Cambie mínimamente el diseño del gráfico, entonces lo que se puede hacer es mostrar esos vértices y bordes en un color transparente, pero en realidad no los elimina. –

+1

@Computist Sí, eso es esencialmente lo que hace "DehighlightHide". – DavidC

Respuesta

0

Es posible que desee comprobar si la opción GraphLayout ayuda con su gráfico en el problema.

he comprobado todas las combinaciones de valores posibles de ComponentLayout y PackingLayout con un gráfico de ejemplo (graph0 y graph1 que es graph0 con un borde retirado, en el siguiente código). Algunas combinaciones sin duda un aspecto más útil para su propósito (cambia el diseño gráfico de menos cuando se elimina un borde. Encuentro

"ComponentLayout" -> "CircularEmbedding" 
"ComponentLayout" -> "LayeredDrawing" 
"ComponentLayout" -> "SpiralEmbedding" 

conservar el diseño la mejor.

El código para mostrar todas las combinaciones se

In[5]:= Quit 
In[12]:= $COMPONENTLAYOUTS={(*Automatic,None,*)"CircularEmbedding","HighDimensionalEmbedding","LayeredDrawing","LinearEmbedding","RadialEmbedding","RandomEmbedding","SpiralEmbedding","SpringElectricalEmbedding","SpringEmbedding"}; 
$PACKINGLAYOUTS={"ClosestPacking","ClosestPackingCenter","Layered","LayeredLeft","LayeredTop","NestedGrid"}; 
layoutopt[c_,p_]:=GraphLayout-> {"ComponentLayout"->$COMPONENTLAYOUTS[[ c]],"PackingLayout"-> $PACKINGLAYOUTS[[p]]}; 
In[4]:= words=DictionaryLookup["*zz"]; 
In[5]:= graph0=Flatten[Map[(Thread[#\[DirectedEdge]DeleteCases[Nearest[words,#,3],#]])&,words]]; 
i=RandomInteger[{1,Length[graph0]}]; 
graph0[[i]] 
graph1=Drop[graph0,{i}]; 
Out[7]= tizz\[DirectedEdge]fizz 
In[18]:= g0[i_,j_]:=Graph[graph0,VertexLabels->"Name",ImagePadding->20,ImageSize->200,layoutopt[i,j]]; 
g1[i_,j_]:=Graph[graph1,VertexLabels->"Name",ImagePadding->20,ImageSize->200,layoutopt[i,j]] 

Column[Grid/@Table[ 
{ 
$COMPONENTLAYOUTS[[c]], 
$PACKINGLAYOUTS[[p]], 
g0[c,p], 
g1[c,p] 
}, 
{c,1,Length[$COMPONENTLAYOUTS]}, 
{p,1,Length[$PACKINGLAYOUTS]} 
]] 
6

Como saben hay varios formatos de gráfico que circulan en las MMA. Tenemos el formato de paquete Combinatorica, el formato y el formato GraphPlot M8 Graph.

GraphPlot
Puede encontrar las coordenadas de los nodos GraphPlot de la siguiente manera.

GraphPlot[{1 -> 2, 2 -> 3, 3 -> 1, 3 -> 4}, DirectedEdges -> True, 
      VertexLabeling -> True] 

enter image description here

Esta trama puede ser manipulado manualmente.Todavía se puede encontrar las coordenadas tanto el viejo y el nuevo en él:

enter image description here

VertexCoordinateRules -> {{0.000196475, 0.}, {0.,0.847539}, 
          {0.916405, 0.423865}, {2.03143, 0.42382}} 

enter image description here

VertexCoordinateRules -> {{0.000196475, 0.}, {0., 0.847539}, 
          {1.07187,0.708887}, {1.9537, 0.00924285}} 

Puede dibujar el diagrama de nuevo utilizando las coordenadas modificadas:

GraphPlot[{1 -> 2, 2 -> 3, 3 -> 1, 3 -> 4}, DirectedEdges -> True, 
      VertexLabeling -> True, newRules] 

enter image description here

o dibujar un nuevo gráfico

GraphPlot[{1 -> 2, 2 -> 3, 3 -> 1, 3 -> 4, 1 -> 5, 5 -> 4}, 
      DirectedEdges -> True, VertexLabeling -> True] 

que por defecto tiene el siguiente aspecto:

enter image description here

usando las viejas coordenadas:

updatedRules = VertexCoordinateRules -> 
       Append[VertexCoordinateRules /. newRules, {1, 0}]; 
GraphPlot[{1 -> 2, 2 -> 3, 3 -> 1, 3 -> 4, 1 -> 5, 5 -> 4}, 
      DirectedEdges -> True, VertexLabeling -> True, updatedRules] 

enter image description here


Gráfico

no creo que se puede manipular un Graph como puedas un GraphPlot, pero se puede acceder coordina su vértice.

GraphData["AGraph"] 

enter image description here

oldCoords = AbsoluteOptions[GraphData["AGraph"], VertexCoordinates] 

(* ==> VertexCoordinates -> {{1., 2.}, {2., 3.}, {2., 1.}, {1.,1.}, 
         {1., 3.}, {2., 2.}} *) 

Es bueno tener estas viejas coordenadas porque si nos re-crear este gráfico usando su matriz de adyacencia su diseño es ligeramente diferente. Esto se puede restaurar usando las coordenadas antiguas.

enter image description here

+0

+1 para mostrar cómo agarrar 'VertexCoordinates'. Resulta que se pueden leer y establecer en MMA 8.0. – DavidC

9

Aquí hay dos enfoques básicos para alterar los gráficos en las MMA 8.0. El primero se basa en HighlightGraph y en particular en GraphHighlightStyle -> "DehighlightHide". El segundo enfoque usa los VertexCoordinates de un gráfico en futuras variantes de ese gráfico.

Discutiremos la eliminación por separado de la suma porque implican métodos ligeramente diferentes.

[P.S. : Hice varias ediciones a mi respuesta para que sea más claro]

En primer lugar algunos datos:.

edges={1\[UndirectedEdge]8,1\[UndirectedEdge]11,1\[UndirectedEdge]18,1\[UndirectedEdge]19,1\[UndirectedEdge]21,1\[UndirectedEdge]25,1\[UndirectedEdge]26,1\[UndirectedEdge]34,1\[UndirectedEdge]37,1\[UndirectedEdge]38,4\[UndirectedEdge]11,4\[UndirectedEdge]12,4\[UndirectedEdge]26,4\[UndirectedEdge]27,4\[UndirectedEdge]47,4\[UndirectedEdge]56,4\[UndirectedEdge]57,4\[UndirectedEdge]96,4\[UndirectedEdge]117,5\[UndirectedEdge]11,5\[UndirectedEdge]18,7\[UndirectedEdge]21,7\[UndirectedEdge]25,7\[UndirectedEdge]34,7\[UndirectedEdge]55,7\[UndirectedEdge]76,8\[UndirectedEdge]11,26\[UndirectedEdge]29,26\[UndirectedEdge]49,26\[UndirectedEdge]52,26\[UndirectedEdge]111,27\[UndirectedEdge]28,27\[UndirectedEdge]51,42\[UndirectedEdge]47,49\[UndirectedEdge]97,51\[UndirectedEdge]96} 

Aquí está la gráfica inicial:

g = Graph[edges, VertexLabels -> "Name", ImagePadding -> 10, 
ImageSize -> 500] 

Fig1

" Borrando "un borde del gráfico sin cambiar la apariencia general del gráfico".

Comencemos por quitar el borde (4,11) ubicado en el centro del gráfico. remainingEdgesAndVertices contiene todos los vértices y los bordes iniciales a excepción del borde (4,11).

remainingEdgesAndVertices = 
Join[VertexList[g], Complement[EdgeList[g], {4 \[UndirectedEdge] 11}]] 

Vamos a "borrar" (es decir, ocultar) del borde (4,11): borde

HighlightGraph[g, remainingEdgesAndVertices, VertexLabels -> "Name", 
    ImagePadding -> 10, GraphHighlightStyle -> "DehighlightHide", 
    ImageSize -> 500] 

Fig2

Si hubiéramos hecho eliminado (4, 11) el gráfico tendría cambió radicalmente su apariencia.

Graph[Complement[edges, {4 \[UndirectedEdge] 11}], 
    VertexLabels -> "Name", ImagePadding -> 10, ImageSize -> 500] 

Fig3

"Adición de" un borde gráfico sin cambiar el aspecto general del gráfico.

Agregar un borde de gráfico es un poco más desafiante. Hay dos maneras en que vienen a la mente. El método utilizado aquí funciona al revés. Incluyes el nuevo borde primero en forma oculta y luego lo destapas más tarde. El gráfico inicial con el borde oculto "por añadir" estará en un diseño similar al del gráfico con el borde "nuevo". La razón es esta: de hecho son el mismo gráfico: sin embargo, muestran diferentes números de bordes.

g2 = Graph[Append[edges, 42 \[UndirectedEdge] 37], 
VertexLabels -> "Name", ImagePadding -> 10, ImageSize -> 500] 

HighlightGraph[g2, 
    Join[Complement[EdgeList[g2], {42 \[UndirectedEdge] 37}], 
    VertexList[g2]], VertexLabels -> "Name", ImagePadding -> 10, 
    GraphHighlightStyle -> "DehighlightHide"] 

Fig4

ahora muestran el gráfico con el "nuevo borde" añadió. Fig

Esto se ve muy diferente de la figura 1. Sin embargo, parece ser una extensión natural de la Fig. 4.

La adición de nuevos vértices y aristas sobre la marcha

Hay otro forma de agregar bordes (y vértices) mientras se mantiene la apariencia general. Fue inspirado por algo que Sjoerd escribió en su respuesta.

Vamos a reservar el punto {0,0} para un futuro vértice 99. Simplemente añadir que apuntan a la VertexCoordinates de G2:

vc = VertexCoordinates -> 
    Append[AbsoluteOptions[g2, VertexCoordinates][[2]], {0, 0}] 

Ahora vamos a ver lo que parece. g3 es solo g2 con el vértice adicional (999) y el borde (4,99).

g3 = Graph[Append[EdgeList [g2], 4 \[UndirectedEdge] 999], vc, 
    VertexLabels -> "Name", ImagePadding -> 10, 
    GraphHighlightStyle -> "DehighlightHide", ImageSize -> 500] 

Fig6

Este procedimiento nos permite añadir nuevas aristas y vértices a medida que avanzamos. Pero se necesitarán algunas pruebas y errores para garantizar que los nuevos vértices estén ubicados en una posición adecuada.

Agregar solo otro borde (sin un nuevo vértice) es mucho más fácil: simplemente agregue el nuevo borde y use el VertexCoordinates del gráfico anterior.

Debería poder eliminar bordes de un gráfico usando el mismo enfoque (usando el mismo VertexCoordinates).

+0

En varios lugares, el vértice 999 se describe incorrectamente como el vértice 99. Lo cambiaría pero ya hice muchas ediciones y quiero evitar que este sea un wiki de la comunidad. – DavidC

0

Esto es, en el mejor de los casos, una respuesta parcial. Además, estoy trabajando con Mma 7.

Si modifico un gráfico que ahora contiene un vértice 'huérfano' (sin bordes de conexión) pero aún quiero mostrar el vértice en un nuevo gráfico, esto puede hacerse mediante la conversión a un adjacency matrix (como se ha señalado originalmente por Carl Woll)

por ejemplo:

gr1 = {1 -> 2, 2 -> 3, 3 -> 4, 4 -> 5, 5 -> 6, 6 -> 1}; 
gplot1 = GraphPlot[gr1, Method -> "CircularEmbedding", 
    VertexLabeling -> True] 

Definición de una nueva gráfica, GR2, como sigue:

gr2 = {2 -> 3, 3 -> 4, 4 -> 5, 5 -> 6} 

Un nuevo gráfico que muestra vértice 1 puede ser generada como sigue, por ejemplo:

Needs["GraphUtilities`"]; 

gplot2 = 
GraphPlot[[email protected][# -> 1 &, EdgeList[gr2]], 
    VertexLabeling -> True, 
    VertexCoordinateRules -> 
    Thread[VertexList[gr1] -> 
    [email protected][gp1, GraphicsComplex[points_, __] :> points, 
     Infinity]]] 

dando

enter image description here

Cuestiones relacionadas