4
$\begingroup$

I want to create a series of plot markers which are circles, squares etc. with 2-3 letter codes centered within the marker. My current attempt looks like this:

{
t4dot =  Graphics[{Green, Disk[{0, 0}, ImageScaled[0.07]], 
          Style[Text["T4"], Yellow, Bold, 18]}],
gk1dot = Graphics[{Red, Rectangle[{0, 0}], 
          Style[Text["Gk1", {0.5, 0.5}], Yellow, Bold, 14]}]
}

which makes:

enter image description here

The "T4" marker is about right (although the centering is an issue). Obviously, I haven't been able to get rectangle[] to scale properly. When I tried to use these graphics as plot markers the circle and rectangle were huge and swamped the graph whilst the text stayed the same size.

I am aiming to make markers for which the graphics primitive and the text are nicely centered and scale as a group. I want to be able to call the resulting graphics with something like:

ListPlot[{{5, 7}, {4, 6}}, PlotMarkers -> {{t4dot, 16}, {gk1dot, 18}},
  PlotRange -> {{3, 6}, {3, 8}}, ImagePadding -> 35]

Any ideas about how to achieve this?

Also, I have looked here and here and I noticed that Mathematica often offsets the text towards the top-left corner of the graphic. Is there a way to overcome this?

$\endgroup$
3
  • 1
    $\begingroup$ Have a look here: mathematica.stackexchange.com/a/18828/131. Might be considered borderline duplicate (as already linked by yourself). $\endgroup$
    – Yves Klett
    Commented Apr 11, 2013 at 8:58
  • $\begingroup$ @YvesKlett, Yes, it is borderline. I think I can make the solution in that post work for me (but it's not ideal). The main downfall is that it still doesn't center the text nicely and cannot be applied to specific plotmarker shapes. For example, if I have a long piece of text I cannot see a way of using Framed[] to make a square around it (it would be nice to be able make diamonds as well!). $\endgroup$
    – geordie
    Commented Apr 11, 2013 at 9:42
  • $\begingroup$ Understood - just wanted to point you there in case this helped right away. As for the centering, I feel Framed does not do too bad, but perhaps you can come up with a really bad example... $\endgroup$
    – Yves Klett
    Commented Apr 11, 2013 at 11:03

1 Answer 1

4
$\begingroup$

You have to center the Rectangle at {.5, .5}, and you also have to have two datasets. Simply feeding {{5, 7}, {4, 6}} is interpreted by ListPlot as a single dataset. For clarity, I've added some extra points.

t4dot = Graphics[{Green, Disk[{0, 0}, ([email protected])], 
     Style[Text["T4", Offset@{2, -1}], Yellow, Bold, 18]}];
gk1dot = Graphics[{Red, Rectangle[ImageScaled[{.5,.5}-.07], ImageScaled[{.5,.5}+.07]], 
     Style[Text["Gk1", Offset@{2, -1}], Yellow, Bold, 14]}];

ListPlot[{{{4, 6}, {5, 7}}, {{4, 3}, {5, 2}}}, 
 PlotMarkers -> {{t4dot, 1}, {gk1dot, 1}}, 
 PlotRange -> {{3, 6}, {1, 8}}, ImagePadding -> 35]

enter image description here

$\endgroup$
4
  • $\begingroup$ Your solution looks good, unfortunately, your definition for gk1dot throws up errors for me. I'm running 8.0.4 on a Mac-SL $\endgroup$
    – geordie
    Commented Apr 11, 2013 at 9:36
  • $\begingroup$ @geordie It was just missing a bracket due to editing. Corrected now. $\endgroup$ Commented Apr 11, 2013 at 9:40
  • $\begingroup$ Many thanks. The centering is still slightly variable. Is there a way to 'force' mathematica to get it dead center (or am i opening a graphical can of worms)? $\endgroup$
    – geordie
    Commented Apr 11, 2013 at 9:47
  • $\begingroup$ @geordie I think you always have to manually finetune these kind of things, but I may be wrong. The links you have included show some other solutions, e.g. with Inset. Might be rewarding to experiment with it. $\endgroup$ Commented Apr 11, 2013 at 11:25

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.