Построение легенд в 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

Это создает пустую и невидимую легенду, но все же позволяет двум графическим изображениям быть правильно составленными с помощью "Показать".

Другие вопросы по тегам