如何在不使用PlotLegends包的情况下为函数绘制图例?
如何在不使用PlotLegends包的情况下为函数绘制图例?
我也曾因为获取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"
]
]
Show[
Plot[{Sin[x], Sinh[x]}, {x, -Pi, Pi}],
ListPlot[Join[{#, Sin[#]} & /@ Range[-Pi, Pi, .5],
{#, Sinh[#]} & /@ Range[-Pi, Pi, .5]]]
]
现在我们想在图表上加一个图例,这样读者就知道他们正在看什么了。但实际操作起来并不容易!让我们把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]]]
]
这看起来非常好!立即发布!
对于如此基本和普遍需要的功能,寻找一个可以正常工作的PlotLegend替代品确实需要很多工作。到目前为止,我发现的最佳替代方案是精心构建一组绘图样式,然后手动构建图例,并最终使用ShowLegend[]将其与图形一起显示。(例如,请参见这里) 这是可能的,但需要很多工作。
因此,如果有人知道一个解决办法使PlotLegend正常工作,一个效果更好的替代包,或者只是一个可以轻松自动化的图例的巧妙方法,我将非常感激!这肯定会让生活变得更容易。
如果您在尝试使用“Show”组合两个图像时遇到了James所描述的奇怪行为,那么您应该尝试使用“Overlay”功能而不是“Show”。
另外,我发现只要两个图形都有图例,“Show”就会正确地呈现复合图像。
如果同时拥有两个图例看起来有点傻,那么您可以使用选项之类的方法从第二个图形中删除一个图例:
PlotLegend -> {},
LegendPosition -> {0.1, 0.1},
LegendSize -> 0.001,
LegendShadow -> None,
LegendBorder -> None
这将创建一个空的、不可见的图例,但仍然允许通过“显示”正确组合这两个图形。