Я строю информацию одного и того же типа, но для разных стран, с несколькими участками с помощью matplotlib. То есть у меня есть 9 графиков на сетке 3х3, все с одинаковыми для линий (конечно, разные значения на линию).
Тем не менее, я не выяснил, как разместить на рисунке одну легенду (поскольку все 9 вспомогательных участков имеют одинаковые линии) только один раз.
Как я могу это сделать?
python
matplotlib
pocketfullofcheese
источник
источник
handles, labels = [(a + b) for a, b in zip(ax1.get_legend_handles_labels(), ax2.get_legend_handles_labels())]
figlegend может быть тем, что вы ищете: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figlegend
Пример здесь: http://matplotlib.org/examples/pylab_examples/figlegend_demo.html
Другой пример:
или:
источник
lines
переменную, для которой нужно указать аргументlegend
?lines
- это список результатов, которые возвращаются изaxes.plot()
(т. е. каждаяaxes.plot
или похожая подпрограмма возвращает «строку»). Смотрите также связанный пример.Для автоматического позиционирования одной легенды
figure
со множеством осей, например, полученных с помощьюsubplots()
, следующее решение работает очень хорошо:С
bbox_to_anchor
иbbox_transform=plt.gcf().transFigure
вы определяете новую ограничивающую рамку размера вашего,figure
чтобы быть ссылкойloc
. Использование(0,-0.1,1,1)
перемещает эту коробку немного вниз, чтобы легенда не помещалась поверх других художников.OBS: используйте это решение ПОСЛЕ того, как вы используете
fig.set_size_inches()
и ДО того, как вы используетеfig.tight_layout()
источник
loc='upper center', bbox_to_anchor=(0.5, 0), bbox_transform=plt.gcf().transFigure
и это точно не будет совпадать.Вы просто должны попросить легенду один раз, вне вашей петли.
Например, в этом случае у меня есть 4 сюжета с одинаковыми строками и одной легендой.
источник
figlegend
, как полагает Эверт, кажется, гораздо лучшее решение;)fig.legend()
заключается в том, что требуется идентификация для всех линий (графиков) ... поскольку для каждого подзаголовка я использую цикл для генерации линий, единственное решение, которое я нашел, чтобы преодолеть это, - создать пустой список до второй цикл, а затем добавить строки по мере их создания ... Затем я использую этот список в качестве аргументаfig.legend()
функции.dados
там?dados
был набор данных из файла netCDF4 (для каждого из файлов, определенных в спискеficheiros
). В каждом цикле читается отдельный файл, и к рисунку добавляется подплот.Я заметил, что при отсутствии ответа отображается изображение с одной легендой, ссылающейся на множество кривых на разных участках, поэтому я должен показать вам одну ... чтобы вы заинтересовались ...
Теперь вы хотите посмотреть на код, не так ли?
Две линии
заслуживает объяснения - для этой цели я инкапсулировал сложную часть в функции, всего 4 строки кода, но тщательно прокомментировал
PS Я признаю, что
sum(list_of_lists, [])
это действительно неэффективный метод, чтобы сгладить список списков, но «мне нравится его компактность», обычно это несколько кривых в нескольких сюжетах и «Matplotlib и эффективность»? ;-)источник
Пока я немного опаздываю к игре, я дам здесь другое решение, так как это все еще одна из первых ссылок, которая будет отображаться в Google. Используя matplotlib 2.2.2, этого можно достичь с помощью функции gridspec. В приведенном ниже примере цель состоит в том, чтобы расположить четыре вспомогательных участка в формате 2x2 с легендой, показанной внизу. Внизу создается ось 'faux', чтобы разместить легенду в фиксированном месте. Затем ось 'faux' отключается, поэтому отображается только легенда. Результат: https://i.stack.imgur.com/5LUWM.png .
источник
если вы используете участки с гистограммами, с разным цветом для каждой гистограммы. может быть быстрее создать артефакты самостоятельно, используя
mpatches
Скажем, у вас есть четыре бара с разными цветами, так как
r
m
c
k
вы можете установить легенду следующим образомисточник
plt.legend
чтобы иметь одну легенду для всех моих подсюжетовhandles, _ = plt.gca().get_legend_handles_labels()
fig.legend(handles, labels)
Этот ответ является дополнением к @ Evert's на позиции легенды.
Моя первая попытка решения @ Evert не удалась из-за совпадения легенды и названия подзаговора.
Фактически, перекрытия вызваны тем
fig.tight_layout()
, что меняет расположение подзаговоров без учета условных обозначений рисунка. Однакоfig.tight_layout()
это необходимо.Чтобы избежать наложений, мы можем сказать,
fig.tight_layout()
чтобы оставить место для легенды фигурыfig.tight_layout(rect=(0,0,1,0.9))
.Описание параметровight_layout () .
источник
Чтобы основываться на ответе @ gboffi's и Ben Usman:
В ситуации, когда на разных участках имеются разные линии с одним и тем же цветом и меткой, можно сделать что-то вроде
источник