21
$\begingroup$

The legending functionality in versions 9 and higher is much easier to use than the PlotLegends package and other bespoke ways of creating legends in earlier versions. However, the vertical spacing between items is larger than I would like. How can I reduce this spacing?

Changing the LegendMarkerSize option to a smaller number without changing the size specified in the LegendMarkers option just ends up cutting off the graphic. LegendMargins doesn't affect the inter-item spacing, only the space between the whole legend and other items.

PointLegend[{RGBColor[1, 0, 0], RGBColor[0, 0, 1]}, {"Series 1", "Series 2"}, 
 LegendMarkers -> {{"\[FilledCircle]", 20}, {"\[FilledCircle]", 20}}, 
 LegendMarkerSize -> 19, 
 LabelStyle -> {FontFamily -> "Arial", FontSize -> 20}] 

enter image description here

$\endgroup$

2 Answers 2

26
$\begingroup$

It turns out that the Spacings option does exactly what is needed, even though its use in legend constructs such as PointLegend is not documented, and it shows as red text when you use it in those constructs.

PointLegend[{Red, Blue}, {"Series 1", "Series 2"}, 
 LegendMarkers -> {{"\[FilledCircle]", 20}, {"\[FilledCircle]", 20}}, 
 Spacings -> {0.2, 0.2}, LegendMarkerSize -> 19, 
 LabelStyle -> {FontFamily -> "Arial", FontSize -> 20}]

enter image description here

This continues the tradition of undocumented options and functions in Mathematica.

UPDATE (2): the Spacings option is still marked with red text in version 10.0.1, 10.1 and 10.3 and 11.0.

$\endgroup$
1
  • 13
    $\begingroup$ I wished WRI would do once a "documentation release": no new features, just existing ones better, much better,documented. $\endgroup$ Jan 9, 2013 at 22:50
9
$\begingroup$

Another option, which I use now, is to use Grid. With Grid you have all the options that comes with Grid and hence you can build the legend in as many different ways as you wish.

Manipulate[

 plotLegend = 
  Placed[LineLegend["Expressions", LegendMargins -> 1, 
    LegendLayout -> Function[{x},
      Grid[x, Spacings -> {hspacing, vspacing}, Alignment -> Left, 
       Frame -> isFrame]]], location];

 Plot[{Sin[x], Cos[x]}, {x, -Pi, Pi}, PlotLegends -> plotLegend, 
  ImageSize -> 300, ImageMargins -> 50, Frame -> True],
 Grid[{
   {"vertical spacing", 
    Control[{{vspacing, .1, ""}, 0, 3, .01, Appearance -> "Labeled"}]},
   {"horizontal spacing", 
    Control[{{hspacing, .1, ""}, 0, 3, .01, Appearance -> "Labeled"}]},
   {"add frame?", Checkbox[Dynamic[isFrame]], , SpanFromLeft},
   {"location?", PopupMenu[Dynamic[location, (location = #) &],
     {
      {Right, Top} -> Style["{Right,Top}", 12],
      Right -> Style["Right", 12],
      Left -> Style["Left", 12],
      {Right, Bottom} -> Style["{Right,Bottom}", 12],
      Above -> Style["Above", 12],
      Below -> Style["Below", 12]
      }], SpanFromLeft
    }
   }, Spacings -> {0, 1}, Alignment -> Left],
 {{location, {Right, Top}}, None},
 {{isFrame, True}, None}
 ]

Mathematica graphics

$\endgroup$
1
  • $\begingroup$ For expressions, it works fine. But it is not working for Listplot. Can you please address it for Listplot? $\endgroup$
    – atanu
    Oct 19, 2022 at 3:53

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.