построение легенд в Mathematica - PullRequest
23 голосов
/ 12 августа 2010

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

Ответы [ 3 ]

15 голосов
/ 02 сентября 2010

Я тоже был разочарован трудностью заставить 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"
  ]
]

generated image

7 голосов
/ 20 августа 2010

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

Чтобы рассказать вам, что не так с 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, альтернативный пакет, который работает лучше, или просто аккуратный способ получить легенды, которые можно легко автоматизировать, я был бы очень признателен!Это определенно сделало бы жизнь немного легче.

1 голос
/ 14 июля 2012

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

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

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

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

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

...