6
$\begingroup$

Consider the following code:

vsh[{xc_, yc_}, name_, {w_, h_}] := {LightYellow, 
   Rectangle[{xc - w, yc - h}, {xc + w, yc + h}], 
   Inset[Style[Text[name], 14, Black, Bold], {xc, yc}]};
options = 
  Sequence[VertexSize -> 0.1, VertexShapeFunction -> vsh, 
   GraphLayout -> "CircularEmbedding", ImageSize -> 350, 
   EdgeStyle -> Blue];

g1 = Graph[{1 -> 2, 1 -> 3, 2 -> 4, 3 -> 4}, options];
g1

The output will be a simple graph with vertex labels depicted in rectangles (as can be inferred from vsh):

Mathematica output

My question is: how can I encapsulate the vertex labels in circles instead? Nothing I've tried seems to be working.

$\endgroup$
3
  • 1
    $\begingroup$ try changing Rectangle[...] to Disk[{xc, yc}, Min[w, h]] or use any other function of w and h to control the radius. $\endgroup$
    – kglr
    Sep 28, 2012 at 0:46
  • $\begingroup$ @kguler Thank you very much, this worked. $\endgroup$
    – arshajii
    Sep 28, 2012 at 0:53
  • $\begingroup$ A.R.S. my pleasure. It is always fun to play with custom shape function. I posted an alternative way to get the same result using options VertexStyle, VertexLabels and VertexLabelStyle. $\endgroup$
    – kglr
    Sep 28, 2012 at 1:32

3 Answers 3

14
$\begingroup$

You can change Rectangle[...] to Disk[{xc, yc}, Min[w, h]] or use any other function of w and h to control the disk radius.

But ... you can also get the same result without having to define a custom VertexShapeFunction using the options:

options = Sequence[VertexStyle -> LightYellow,
   VertexSize -> 0.15,
   VertexLabels -> Placed["Name", Center], 
   VertexLabelStyle -> Directive[20, Red, Bold, Italic], 
   GraphLayout -> "CircularEmbedding", ImageSize -> 350, 
   EdgeStyle -> Blue];

Graph[{1 <-> 2, 2 <-> 3, 3 <-> 1}, options]

enter image description here

You can also use the option PlotTheme -> "IndexLabeled" in versions 12.0+:

Graph[{1 <-> 2, 2 <-> 3, 3 <-> 1}, PlotTheme -> "IndexLabeled", 
 VertexStyle -> Yellow, VertexSize -> Medium, 
 VertexLabelStyle -> Directive[Italic, 16], EdgeStyle -> Blue] 

enter image description here

$\endgroup$
2
  • $\begingroup$ Placed["Name", Center] works too. $\endgroup$
    – Szabolcs
    Dec 30, 2017 at 11:02
  • $\begingroup$ @Szabolcs, yes, thank you. Made the change. $\endgroup$
    – kglr
    Dec 30, 2017 at 11:05
1
$\begingroup$

According to google you are supposed to use VertexRenderingFunction.

$\endgroup$
1
  • 1
    $\begingroup$ Not too sure, but I think that works with GraphPlot, not with Graph... $\endgroup$
    – cormullion
    Sep 28, 2012 at 17:46
1
$\begingroup$

Try:

Rectangle[{xc - w, yc - h}, {xc + w, yc + h}, RoundingRadius -> 1000]

Rounded corners rather than circles can be had with smaller values.

$\endgroup$

Your Answer

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

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