绘制Mathematica中的传说

时间:2010-08-11 22:42:32

标签: wolfram-mathematica plot

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

3 个答案:

答案 0 :(得分: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”是一个与Graphics对象的“names”长度相同的列表,表示要渲染的绘图标记或图形; “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"
  ]
]

generated image

答案 1 :(得分:7)

我对这个问题的答案也很感兴趣。

告诉你PlotLegends有什么问题:它非常不稳定,在很多情况下根本不起作用。

以下是PlotLegends完全搞砸的示例。输出来自Mathematica 7.0:

假设我们测量了一些与多个函数相对应的数据点,并且我们希望显示它们与理想函数的比较情况,或者它们与计算拟合的匹配程度。没问题!我们将只显示[]平滑图和数据点的ListPlot,对吗?

看起来像这样:

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 []将其与绘图一起显示。 (参见例如here)这是可能的,但是很多工作。

因此,如果有人知道使PlotLegend工作的解决方法,一个更好的替代包,或者只是一个简单的方法来获得可以轻松自动化的传说,我将非常感激!这肯定会让生活变得更轻松。

答案 2 :(得分:1)

如果您遇到詹姆斯描述的奇怪行为当您尝试使用“显示”来组合两个图像时,您应该使用“叠加”功能而不是“显示”。

或者,我发现只要两个图形都有图例,“显示”就会正确渲染合成图像。

如果看起来有点愚蠢有两个图例,那么你可以使用以下选项从第二个图形中删除一个:

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

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