Wolfram mathematica 在Mathematica中绘制图例

Wolfram mathematica 在Mathematica中绘制图例,wolfram-mathematica,plot,Wolfram Mathematica,Plot,如何在不使用PlotLegends软件包的情况下为函数绘制图例?我也对这个问题的答案非常感兴趣 告诉你PlotLegends有什么问题:它非常不稳定,在很多情况下根本不起作用 下面是一个图例完全出错的示例。输出来自Mathematica 7.0: 假设我们已经测量了一些对应于许多函数的数据点,我们想展示它们与理想函数的比较情况,或者它们与计算拟合的匹配情况。没问题!我们将显示平滑图和数据点的列表图,对吗 它可能看起来像这样: Show[ Plot[{Sin[x], Sinh[x]}, {x,

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

我也对这个问题的答案非常感兴趣

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

下面是一个图例完全出错的示例。输出来自Mathematica 7.0:

假设我们已经测量了一些对应于许多函数的数据点,我们想展示它们与理想函数的比较情况,或者它们与计算拟合的匹配情况。没问题!我们将显示平滑图和数据点的列表图,对吗

它可能看起来像这样:

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

现在我们想在情节上加上一个传说,这样读者就会知道他们到底在看什么。说起来容易做起来难,先生!让我们将PlotLegend添加到绘图[]:

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]]]
 ]

这看起来很棒!立即发布

对于这样一个基本的、普遍需要的功能,找到一个可以替代PlotLegend的方法确实需要做大量的工作。到目前为止,我发现最好的替代方法是仔细地构建一个plotstyles列表,然后手工构建图例,最后使用ShowLegend[]将其与绘图一起显示。(参见示例)这是可能的,但需要做很多工作


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

我也对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]}
];
它是灵活的,但不是那么容易使用。“名称”是要在图例中呈现的字符串列表;“标记”是一个列表,其长度与表示要渲染的打印标记或图形的图形对象的“名称”相同;“原点”是一个两元素列表,图例左上角有绝对水平和垂直位置;“markerSize”是要缩放标记的点数;“fontSize”是字体大小;“字体”是要使用的字体的名称。以下是一个例子:

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"
  ]
]

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

或者,我发现只要两个图形都有图例,那么“Show”就可以正确地渲染合成图像

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

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

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

PlotLegends有什么具体错误?我的意思是,你可以不用它来制作传奇(见我的答案),但它充其量也很笨拙。@Timo我很抱歉地说,但传奇有点丑陋。一个巨大的盒子,里面的内容间隔很大。默认情况下,无人使用的放置阴影。无数的手工艺品,如下图所示(但还有更多)。@Sjoerd:别抱歉,我同意它们很难看。但这可能不是OP发布这个问题的原因,因此我问他具体有什么问题。