Подтвердить что ты не робот

Печать легенд в Mathematica

Как вы рисуете легенды для функций без использования пакета PlotLegends?

4b9b3361

Ответ 1

Я тоже был разочарован трудностью заставить 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" - это список строк для рендеринга в легенде; "Маркеры" - это список с такой же длиной, как "имена" объектов 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"
  ]
]

generated image

Ответ 2

Мне также очень хотелось бы ответить на этот вопрос.

Чтобы рассказать вам, что не так с 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 к графику []:

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 []. (См. Например здесь) Возможно, но много работы.

Итак, если кто-нибудь знает об обходном пути, чтобы заставить PlotLegend работать, альтернативный пакет, который работает лучше, или просто аккуратный способ получить легенды, которые можно легко автоматизировать, я был бы очень благодарен! Это, безусловно, сделало бы жизнь немного легче.

Ответ 3

Если вы испытываете странное поведение, описанное Джеймсом. Когда вы пытаетесь использовать "Показать" для объединения двух изображений, вам следует поиграть с использованием функции "Overlay" вместо "Show".

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

Если он выглядит немного глупым, имея две легенды, вы можете удалить его со второго рисунка, используя следующие опции:

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

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