2010-10-09 20 views
5

Quiero crear un gráfico (Teoría de gráficos) donde ciertos bordes tengan un color diferente a otros bordes, que se usarían para resaltar una ruta en el gráfico de un vértice a otro .Creando un gráfico con bordes de diferentes colores en Mathematica

Aquí hay algunos ejemplos que tienen diferentes bordes de color http://demonstrations.wolfram.com/AGraphTheoryInterpretationOfTheSumOfTheFirstNIntegers/ y http://demonstrations.wolfram.com/Ramsey336/. Miré el código fuente para estos, pero esas soluciones parecen complicadas. Necesito un ejemplo simple para trabajar desde. Creo que necesito usar EdgeRenderingFunction como una de las opciones para GraphPlot.

Adicionalmente bajo EdgeRenderingFunction documentación, en parte, "Más información" que dice:

Mathematica graphics

Esto parece útil, pero por desgracia no hay ejemplos codificados para probar.

Teniendo esto muy literalmente, he intentado cosas como

GraphPlot [{1 -> 2, 2 -> 3, 3 -> 4, 4 -> 1, 2 -> 4, 4 -> 5, 4 -> 6}, VertexLabeling -> Es cierto que
EdgeRenderingFunction -> g [{1, 2}, {1, 2} , rojo]]

Pero eso no funcionaría. Tomará algo más inteligente que eso.

Respuesta

6

Aquí hay un ejemplo que ilustra cómo automatizar el resaltado de una ruta en particular a través de un gráfico.

Aquí está un gráfico tonto, especificado por una lista de reglas de borde:

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

Mathematica graphics

Aquí hay un camino a través del gráfico nos gustaría resaltar.

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

Particionemos la ruta en los bordes, lo que explica el hecho de que queremos resaltar el borde independientemente de su orientación.

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

Escribimos un EdgeRenderingFunction que trasmite una ventaja en uno de los dos estilos, dependiendo de si se trata de ninguna en la lista o no.

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

Finalmente, mostramos el resultado.

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

Mathematica graphics

+0

simple, elegante y general +1 –

+0

@ Mark McClure: Mathematica me sorprende de nuevo. ¿Cómo se puede llamar a la función 'erf' sin pasarle ningún argumento? Aunque creó 3 parámetros en la definición de la función, ¿supongo que automáticamente los "encuentra" en el contexto actual? – dbjohn

+0

@dbjohn No he llamado a la función; Simplemente le estoy diciendo a GraphPlot a qué función llamar cuando dibuja los bordes. Aquí hay un ejemplo similar: Seleccione [Rango [9], EvenQ]. En este ejemplo, EvenQ se pasa como un argumento para Seleccionar. Seleccione y selecciona solo los enteros n para los cuales EvenQ [n] devuelve 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 función de representación es una función de devolución de llamada, que toma 3 argumentos. El primero es la lista de coordenadas de la línea, el segundo es los vértices del borde y el tercero es la etiqueta del borde.

En Mathematica puede crear una función anónima con (f[#1,#2,#3,...] &).

+0

que funciona para uno de los bordes. Pero supongamos que quiero colorear un camino que cubra más de un borde y vértice? Probé la modificación: 'Si [# ​​2 == {1, 2, 3, 4, 5} ...' y 'Si [# ​​2 == {{1, 2}, {3, 4}} ... 'pero no funcionó. ¿Algunas ideas? – dbjohn

+0

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

+0

Usted sugiere que use MemberQ como: 'Si [MemberQ [# 2, {2, 3, 4, 5}], Red ...' es decir si los vértices x, y, z están en los miembros de la lista de todos los vértices colorearlos de rojo? Ese código no funciona, MemberQ no puede tomar una lista como segundo argumento. Voy a necesitar una dirección más explícita. – dbjohn

Cuestiones relacionadas