5
$\begingroup$

I'm trying to use GraphPlot to draw a Graph which is constructed from an adjacency matrix and am having trouble with the labels in the plot. I am doing (data is a silly example) the following:

data = Import["~/test.mtx", "MatrixMarket"]
verts = {"Aa", "Ba", "Ca", "Da", "Ea"}

g = WeightedAdjacencyGraph[verts, data, VertexLabels -> "Name"]

Which correctly results in a labelled Adjacency Graph:

Graph Representation

However, when I try and render the graph using a GraphPlot (or similar function...) I always get numbered labels instead. Eg:

GraphPlot[g, 
 VertexRenderingFunction -> ({White, EdgeForm[Black], Disk[#, .1], 
     Black, Text[#2, #1]} &)]

renders as:

GraphPlot rendering of g

My question is how can I get GraphPlot (and similar) to use the vertex names like Graph itself does? Alternatively, is there a better way of providing vertex names when using an Adjacency Matrix? (My real dataset has many thousands of vertices and edges).

$\endgroup$

1 Answer 1

9
$\begingroup$

Update 2: There is a hidden option "VertexNames" for labeling vertices in GraphPlot (also works with LayeredGraphPlot and TreePlot):

verts = {"Aa", "Ba", "Ca", "Da", "Ea", "Fa"};

g1 = CompleteGraph[6, 
   VertexLabels -> {v_ :> Placed[verts[[v]], Center]}, 
   VertexSize -> Medium, ImageSize -> 400];

g2 = GraphPlot[g1, ImageSize -> 400, VertexLabeling -> True, "VertexNames" -> verts];

Row[{g1, g2}]

enter image description here

Note: In version 12.0+, you need to use GraphComputation`GraphPlotLegacy,GraphComputation`LayeredGraphPlotLegacy and GraphComputation`TreePlotLegacy for GraphPlot, LayeredGraphPlot and TreePlot, respectively.

Original answer:

You can modify your VertexRenderingFunction using Text[verts[[#2]], #1] instead of Text[#2, #1]:

verts = {"Aa", "Ba", "Ca", "Da", "Ea", "Fa"};

g1 = WeightedAdjacencyGraph[SparseArray[{{i_, j_} /; (i != j) -> 1}, {6, 6}, \[Infinity]], 
   VertexLabels -> Thread[Range[6] -> verts], ImagePadding -> 20, ImageSize -> 400];
g2 = GraphPlot[g1, ImageSize -> 400,  VertexRenderingFunction -> ({White, EdgeForm[Black],
   Disk[#, .1], Black, Text[verts[[#2]], #1]} &)];
Row[{g1, g2}, Spacer[10]]

enter image description here

or, using Text[#2 /. PropertyValue[g1, VertexLabels], #1]

g3 = GraphPlot[g1, ImageSize -> 400, VertexRenderingFunction ->
   ({White, EdgeForm[Black], Disk[#, .1], Black, 
      Text[#2 /. PropertyValue[g1, VertexLabels], #1]} &)]

enter image description here

Update: Unless you have special reasons to use GraphPlot, you can achieve the same results using Graph:

wam = SparseArray[{{i_, j_} /; (i != j) -> 1}, {6, 6}, \[Infinity]];
WeightedAdjacencyGraph[Labeled[#, Style[#, 24, "Panel", Background -> None], Center] & /@ verts, 
      wam, VertexSize -> Large]

or

WeightedAdjacencyGraph[wam, VertexSize -> Large,
 VertexLabels -> Thread[Range[6] -> 
   (Placed[Style[#, 24, "Panel", Background -> None], Center] & /@ verts)]]

gives

enter image description here

$\endgroup$
2
  • $\begingroup$ It feels to me as though GraphPlot (and similar) should just pick up the vertex names provided to the Graph and is therefore "buggy", but these are useful ways round it. Thanks. $\endgroup$
    – Richard
    Dec 7, 2014 at 19:18
  • $\begingroup$ @barns, thank you for the Accept. $\endgroup$
    – kglr
    Dec 7, 2014 at 19:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.