GraphPlot question
- To: mathgroup at smc.vnet.net
- Subject: [mg67308] GraphPlot question
- From: János <janos.lobb at yale.edu>
- Date: Sat, 17 Jun 2006 04:36:39 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hi, I have an nxm list called ndstr. It is a rule based list, so the element at ndstr[[i,j]] looks like "a1.a2.a3.a4"->"b1.b2.b3.b4", of course a-s and b-s can be different for any i,j combinations. If I take the GraphCoordinates of this list with coord=GarphCoordinates [Flatten[ndstr] ] it spits out coordinates for all vertices. However the order how the nodes' coordinates appear in coord are not trivial. I am guessing that is somewhat relates to Gray coding. I would like to create a function f[i_,j_] that would give a color according to values stored in an ndstrColor table also with an nxm structure and use it with the EdgeStyleFunction->f fashion in GraphPlot. To be able to do that I have to transform the ndstrColor table to have the same format as the coord table. In my particular case nxm is 7x4, that is a matrix with seven rows and 4 columns coords is a 22x2 matrix. Twentytwo is the number of independent vertices in the ndstr list. Here is my example: In[170]:= ndstr = {{"10.84.2.31" -> "10.84.2.254", "10.84.2.254" -> "10.32.1.29", "10.32.1.29" -> "10.32.1.78", "10.32.1.78" -> "10.48.106.45"}, {"10.84.2.42" -> "10.84.2.254", "10.84.2.254" -> "10.32.1.33", "10.32.1.33" -> "10.32.1.82", "10.32.1.82" -> "10.48.106.45"}, {"10.84.10.116" -> "10.84.10.254", "10.84.10.254" -> "10.32.1.29", "10.32.1.29" -> "10.32.1.78", "10.32.1.78" -> "10.48.106.45"}, {"10.84.20.53" -> "10.84.20.254", "10.84.20.254" -> "10.32.1.29", "10.32.1.29" -> "10.32.1.70", "10.32.1.70" -> "10.48.106.45"}, {"10.84.30.16" -> "10.84.30.254", "10.84.30.254" -> "10.32.1.33", "10.32.1.33" -> "10.32.1.74", "10.32.1.74" -> "10.48.106.45"}, {"10.38.155.85" -> "10.38.155.254", "10.38.155.254" -> "10.32.1.49", "10.32.1.49" -> "10.32.1.74", "10.32.1.74" -> "10.48.106.45"}, {"10.40.40.23" -> "10.40.40.254", "10.40.40.254" -> "10.32.1.65", "10.32.1.65" -> "10.32.1.82", "10.32.1.82" -> "10.48.106.45"}}; My ndstrColor table is: Out[182]= {{0, 0.024187218389599533, 0.02592719144474731, 0}, {0, 0.37555752153893274, 0.06459070265015886, 0}, {0, 0.41830807973000594, 0.040645833263024324, 0}, {0, 0.6497291061582198, 0.4186258636315614, 0}, {0, 0.8477454512788037, 0.4294219857324032, 0}, {0, 0.037502590928314886, 0.02630417678156069, 0}, {0, 0.142419879665854, 0.052516012160304604, 0}} coord is: In[171]:= coord = 2*GraphCoordinates[ Flatten[ndstr]] other elements to the GraphPlot are" In[161]:= labels = VertexList[ Flatten[ndstr]] esf[i_, j_] := Block[{}, {Blue, Line[{i, j}], Arrow[{coord[[i]], coord[[i]] + 0.7*(coord[[j]] - coord[[i]])}, HeadScaling -> Absolute]}]; The plot itself without per edge coloring is: In[190]:= GraphPlot[Flatten[ndstr], EdgeStyleFunction -> esf, VertexStyleFunction -> ({White, Disk[#1, {0.17, 0.05}], Black, Circle[#1, {0.2, 0.05}], Red, Text[labels[[#1]], #1]} & ), VertexCoordinates -> coord, TextStyle -> {FontSize -> 8}]; Above in the esf function I would like to override the "Blue" directives with my f[i_,j_] function, or have a transformation rule for the ndstrColor table that makes it like the coord table. I tried the following silly construct in place of the Blue: RGBColor[ndstrColor[[,i,j]],ndstrColor[[,i,j]],ndstrColor[[,i,j]] ] but of course it did not work because ndstrColor is not a 22x2 matrix. Now, In[196]:= Show[Graphics[ (Text[Position[coord, #1], #1] & ) /@ coord]] shows the order of the nodes position and I can visually compare it with the GraphPlot above. My algebra teacher - Andor Kertész - used to say that "from here on you just have to look it till you see it", but I am looking it in the last few hours and I am still not seeing it :) I can see that some kind of Gray coding is involved, but I do not see how. I realize that GraphCoordinates doing something like: UnsortedUnion[Flatten[Map[{#[[1]], #[[2]]} &, Flatten[ndstr]]] ] If I combine the two lists, that is ndstr and ndstrColor like: In[324]:= fcf = Flatten[ ({{#1[[1,1]], #1[[2]]}, {#1[[1,2]], #1[[2]]}} & ) /@ Flatten[Table[Table[ {ndstr[[j,i]], ndstrColor[[j,i]]}, {i, Length[ndstr[[ j]]]}], {j, Length[ndstr]}], 1], 1] so that every element in ndstr is broken apart with the value assigned to both and try to UnsortedUnion it, I am still getting elements where the first part of an elemnt is the same but the second is not and they are more than one neighbor away. I still need to eliminate all elements whose first part was found earlier. Thanks ahead, János