在Mathematica中绘制图例

24

如何在不使用PlotLegends包的情况下为函数绘制图例?


PlotLegends出了什么问题?我的意思是,你可以不用它来做图例(见我的回答),但这样做最好也只能算是一种权宜之计。 - Timo
6
抱歉,要说实话,这些传说有点丑。一个巨大的盒子,内容之间的空隙很大。默认情况下带有没有人使用的投影。还有许多文物,如下图所示(但还有更多)。 - Sjoerd C. de Vries
@Sjoerd:不要抱歉,我同意它们很丑。但这可能不是OP发布这个问题的原因,因此我询问他/她具体有什么问题。 - Timo
3个回答

15

我也曾因为获取PlotLegend的正确工作方式而感到失望。我编写了自己的简短函数来制作自己的自定义图例:

makePlotLegend[names_, markers_, origin_, markerSize_, fontSize_, font_] := 
  Join @@ Table[{
    Text[
      Style[names[[i]], FontSize -> fontSize, font], 
      Offset[
        {1.5*markerSize, -(i - 0.5) * Max[markerSize,fontSize] * 1.25},
        Scaled[origin]
      ],
      {-1, 0}
    ],
    Inset[
      Show[markers[[i]], ImageSize -> markerSize],
      Offset[
        {0.5*markerSize, -(i - 0.5) * Max[markerSize,fontSize] * 1.25},
        Scaled[origin]
      ],
      {0, 0}, 
      Background -> Directive[Opacity[0], White]
    ]
  },
  {i, 1, Length[names]}
];

它很灵活,但使用起来不太容易。 "names" 是一个字符串列表,用于在图例中呈现; "markers" 是一个与 "names" 长度相同的列表,其中包含表示绘图标记或图形的 Graphics 对象; "origin" 是一个具有上左角的绝对水平和垂直位置的两个元素的列表; "markerSize" 是缩放标记的点数; "fontSize" 是字体大小; "font" 是要使用的字体名称。 这是一个示例:

Plot[{x, x^2}, {x, 0, 2}, PlotStyle -> {Blue, Red},
  Epilog -> makePlotLegend[
    {x, x^2},
    (Graphics[{#, Line[{{-1, 0}, {1, 0}}]}]) & /@ {Blue, Red},
    {0.9, 0.3},
    12,
    12,
    "Arial"
  ]
]

生成的图像


7
我也非常想知道这个问题的答案。
PlotLegends有什么问题呢?它非常不稳定,在许多情况下根本不起作用。
以下是一个示例,其中PlotLegends完全失败。输出来自Mathematica 7.0:
假设我们测量了一些数据点对应于若干函数,并且我们想展示它们与理想函数或计算拟合的匹配程度。没问题!我们将平滑曲线和数据点的ListPlot一起使用Show[],对吧?
它可能看起来像这样:
Show[
 Plot[{Sin[x], Sinh[x]}, {x, -Pi, Pi}],
 ListPlot[Join[{#, Sin[#]} & /@ Range[-Pi, Pi, .5], 
               {#, Sinh[#]} & /@ Range[-Pi, Pi, .5]]]
 ]

alt text

现在我们想在图表上加一个图例,这样读者就知道他们正在看什么了。但实际操作起来并不容易!让我们把PlotLegend添加到Plot[]中:

Show[
  Plot[{Sin[x], Sinh[x]}, {x, -Pi, Pi}, PlotLegend -> {Sin[x], Sinh[x]}],
  ListPlot[Join[{#, Sin[#]} & /@ Range[-Pi, Pi, .5], 
                {#, Sinh[#]} & /@ Range[-Pi, Pi, .5]]]
 ]

alt text

这看起来非常好!立即发布!

对于如此基本和普遍需要的功能,寻找一个可以正常工作的PlotLegend替代品确实需要很多工作。到目前为止,我发现的最佳替代方案是精心构建一组绘图样式,然后手动构建图例,并最终使用ShowLegend[]将其与图形一起显示。(例如,请参见这里) 这是可能的,但需要很多工作。

因此,如果有人知道一个解决办法使PlotLegend正常工作,一个效果更好的替代包,或者只是一个可以轻松自动化的图例的巧妙方法,我将非常感激!这肯定会让生活变得更容易。


1

如果您在尝试使用“Show”组合两个图像时遇到了James所描述的奇怪行为,那么您应该尝试使用“Overlay”功能而不是“Show”。

另外,我发现只要两个图形都有图例,“Show”就会正确地呈现复合图像。

如果同时拥有两个图例看起来有点傻,那么您可以使用选项之类的方法从第二个图形中删除一个图例:

PlotLegend -> {},
LegendPosition -> {0.1, 0.1},
LegendSize -> 0.001,
LegendShadow -> None,
LegendBorder -> None

这将创建一个空的、不可见的图例,但仍然允许通过“显示”正确组合这两个图形。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接