Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2008

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: EdgeRenderingFunction to produce edge labels in GraphPlot

  • To: mathgroup at smc.vnet.net
  • Subject: [mg87559] Re: [mg87549] EdgeRenderingFunction to produce edge labels in GraphPlot
  • From: Carl Woll <carlw at wolfram.com>
  • Date: Sun, 13 Apr 2008 03:30:33 -0400 (EDT)
  • References: <200804121103.HAA00303@smc.vnet.net>

Murray Eisenberg wrote:

>I'm having trouble fathoming from the documentation how 
>EdgeRenderingFunction works.  In a display produced by GraphPlot, 
>applied to a graph that's a Graph object created with Combinatorica,  I 
>want to be able to put distinct labels on the edges.
>
>For example, take something very simple:
>
>   g = Cycle[3];
>
>I'd like to put labels "a", "b", "c" on the three {1,2}, {2,3}, {3,1}, 
>respectively.
>
>Here's what I tried finally:
>
>   labels = Characters["abc"];
>   edgeLabelFunction[{u_, v_}] :=
>     labels[[First@Flatten@Position[Edges[Cycle[3]], {u, v}]]]
>
>   offset={0.05,0.05}; (* to move labels away from edges *)
>
>   GraphPlot[g, Method -> None,
>     EdgeRenderingFunction -> ({
>          Line[#1],
>          Inset[edgeLabelFunction[#2], Mean[#1] + offset]
>        ]} &)
>   ]
>
>This does not work.  How, exactly, do I index into the list of edges...
>
>     Edges[g]
>   {{1,2},{2,3},{1,3}}
>
>.. so as to select the labels.  From the reference page on 
>EdgeRenderingFunction, it seems to me that argument #2 is supposed to be 
>the length 2 list {u,v} of vertices with which the edge is incident.
>
>  
>
It seems that GraphPlot conversions of Combinatorica graphs with edge 
labels isn't working. Otherwise you could use the Combinatorica function 
SetEdgeLabels on the graph and then display using EdgeLabeling->True.

One possibility is to manipulate the Graph object produced by 
Combinatorica into a form suitable for GraphPlot. Here is an example:

g = SetEdgeLabels[Cycle[3], {a, b, c}];
g = Replace[First@g, {{a_, b_}, opts___} :> (If[MatchQ[#, EdgeLabel], a 
-> b, {a -> b, #}] &[EdgeLabel /. {opts}]), {1}];

GraphPlot[g, EdgeLabeling -> True]

The alternative as you tried to do, is to add the edge labels using 
EdgeRenderingFunction

First, here's a close facsimile to the default EdgeRenderingFunction:

EdgeRenderingFunction -> ({
    RGBColor[0.5, 0, 0],
    Arrowheads[{{0.5, 0.5, Graphics[{Black, Inset[Style[#3], {0, 0}, 
ImageScaled[{0.5, 0.5}], Automatic, None, Background -> White]}]}, 
{0.03, 0.8}}],
    Arrow[#1]
}&)

Now, it's best if the Combinatorica graph is directed (otherwise 
GraphPlot will try to label it in both directions). So,

g = Cycle[3, Type -> Directed];

labels = Characters["abc"];
edgeLabelFunction[{u_, v_}] := 
labels[[First@Flatten@Position[Edges[Cycle[3, Type -> Directed]], {u, v}]]]

GraphPlot[g, EdgeRenderingFunction -> ({RGBColor[0.5, 0, 0],
     Arrowheads[{{0.5, 0.5,
        Graphics[{Black, Inset[Style[edgeLabelFunction[#2]], {0, 0}, 
ImageScaled[{0.5, 0.5}], Automatic, None,
           Background -> White]}]}, {0.03, 0.8}}], Arrow[#1]} &)]

Carl Woll
Wolfram Research


  • Prev by Date: Re: Player Pro and Packages
  • Next by Date: Re: Re: what does Method->"HighDimensionalEmbedding"
  • Previous by thread: EdgeRenderingFunction to produce edge labels in GraphPlot
  • Next by thread: Re: EdgeRenderingFunction to produce edge labels in GraphPlot