Построение легенд в Mathematica
Как вы рисуете легенды для функций без использования пакета PlotLegends?
3 ответа
Я тоже был разочарован трудностью заставить 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" - это список строк для отображения в легенде; "маркеры" - это список такой же длины, что и "имена" графических объектов, представляющих маркеры графика или графику для визуализации; "origin" - это двухэлементный список с абсолютной горизонтальной и вертикальной позицией верхнего левого угла легенды; "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"
]
]
Я также был бы очень заинтересован в ответе на этот вопрос.
Чтобы рассказать вам, что не так с 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]]]
]
Теперь мы хотели бы поставить легенду на сюжет, чтобы читатели знали, на что они смотрят. Легче сказать, чем сделать, мистер! Давайте добавим 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, альтернативный пакет, который работает лучше, или просто аккуратный способ получить легенды, которые можно легко автоматизировать, я был бы очень благодарен! Это, безусловно, сделает жизнь немного проще.
Если вы испытываете странное поведение, описанное Джеймсом. Когда вы пытаетесь использовать "Показать" для объединения двух изображений, вам следует поиграться с использованием функции "Наложение" вместо "Показать".
Кроме того, я обнаружил, что, если обе графики имеют легенду, "Показать" будет правильно отображать составное изображение.
Если с двумя легендами это выглядит немного глупо, вы можете удалить одну из второй графики, используя такие параметры, как:
PlotLegend -> {},
LegendPosition -> {0.1, 0.1},
LegendSize -> 0.001,
LegendShadow -> None,
LegendBorder -> None
Это создает пустую и невидимую легенду, но все же позволяет двум графическим изображениям быть правильно составленными с помощью "Показать".