У меня есть серия из 20 сюжетов (не субплотов), которые должны быть выполнены в одной фигуре. Я хочу, чтобы легенда была за пределами коробки. В то же время я не хочу менять оси, так как размер фигуры уменьшается. Пожалуйста, помогите мне по следующим вопросам:
- Я хочу, чтобы поле с надписями находилось за пределами участка. (Я хочу, чтобы легенда находилась снаружи с правой стороны области сюжета).
- Есть ли в любом случае, что я уменьшаю размер шрифта текста внутри поля легенды, чтобы размер окна легенды был маленьким.
python
matplotlib
legend
pottigopi
источник
источник
https://stackoverflow.com/a/43439132/52074
. и делает это с двумя строками кода! ответ с ответом +1200 тоже хорош, но я нашел его менее общим.Ответы:
Вы можете уменьшить текст легенды, создав свойства шрифта:
источник
plot1
в этом ответе?legend
в этом ответе?plt.legend(fontsize='small')
Есть несколько способов сделать то, что вы хотите. Чтобы добавить к тому, что @inalis и @Navi уже сказали, вы можете использовать
bbox_to_anchor
ключевое слово аргумент, чтобы частично разместить легенду за пределами осей и / или уменьшить размер шрифта.Прежде чем подумать об уменьшении размера шрифта (что может сильно усложнить чтение), попробуйте поиграть с размещением легенды в разных местах:
Итак, давайте начнем с общего примера:
Если мы делаем то же самое, но используем
bbox_to_anchor
ключевое слово аргумент, мы можем немного сместить легенду за границы осей:Точно так же вы можете сделать легенду более горизонтальной и / или поместить ее вверху рисунка (я также включаю закругленные углы и простую тень):
В качестве альтернативы, вы можете уменьшить ширину текущего графика и поместить легенду полностью вне оси фигуры (примечание: если вы используете quiet_layout () , то оставьте в стороне ax.set_position ():
Аналогичным образом вы можете уменьшить сюжет по вертикали и поместить горизонтальную легенду внизу:
Взгляните на руководство по легендам matplotlib . Вы также можете взглянуть на
plt.figlegend()
.источник
bbox_to_anchor
это кортеж из 4 поплавков (x, y, ширина, высота bbox) или кортеж из 2 поплавков (x, y) в нормализованных осях координаты. "legend = ax.legend()
fig.savefig(bbox_extra_artists=(legend,))
Размещение легенды (
bbox_to_anchor
)Легенда располагается внутри ограничительной рамки осей, используя
loc
аргумент toplt.legend
.Например,
loc="upper right"
легенда размещается в правом верхнем углу ограничивающего прямоугольника, который по умолчанию расширяется от(0,0)
до до(1,1)
в координатах осей (или в обозначениях ограничивающего прямоугольника(x0,y0, width, height)=(0,0,1,1)
).Чтобы разместить легенду за пределами ограничительной рамки осей, можно указать кортеж
(x0,y0)
координат осей нижнего левого угла легенды.Однако более универсальным подходом было бы вручную указать ограничивающий прямоугольник, в который следует поместить легенду, используя
bbox_to_anchor
аргумент. Можно ограничить себя, чтобы предоставить только(x0,y0)
часть bbox. Это создает поле с нулевым интервалом, из которого легенда будет расширяться в направлении, заданномloc
аргументом. Напримерразмещает легенду вне осей, так что верхний левый угол легенды находится в положении
(1.04,1)
в координатах осей.Ниже приведены дополнительные примеры, где дополнительно показано взаимодействие между различными аргументами типа
mode
иncols
.Подробности о том, как интерпретировать аргумент из 4-х кортежей
bbox_to_anchor
, напримерl4
, можно найти в этом вопросе . Расширениеmode="expand"
расширяет легенду по горизонтали внутри ограничительной рамки, заданной 4-кортежем. Для вертикально развернутой легенды см. Этот вопрос .Иногда может быть полезно указать ограничивающий прямоугольник в координатах фигуры вместо координат осей. Это показано в примере
l5
сверху, гдеbbox_transform
аргумент используется для размещения легенды в левом нижнем углу рисунка.Постобработка
Размещение легенды вне осей часто приводит к нежелательной ситуации, когда она полностью или частично выходит за пределы рисунка.
Решения этой проблемы:
Корректировка параметров подплота
Можно настроить параметры подплота так, чтобы оси занимали меньше места внутри фигуры (и тем самым оставляли больше места легенде) с помощью
plt.subplots_adjust
. Напримероставляет 30% свободного пространства на правой стороне фигуры, где можно разместить легенду.
Плотная компоновка
Использование
plt.tight_layout
Позволяет автоматически настраивать параметры подзаговора таким образом, чтобы элементы фигуры плотно прилегали к краям фигуры. К сожалению, легенда не принимается во внимание в этом автомате, но мы можем предоставить прямоугольник, в который будет помещаться вся область сюжетов (включая метки).Сохранение рисунка с помощью
bbox_inches = "tight"
аргумента
bbox_inches = "tight"
toplt.savefig
можно использовать для сохранения рисунка, чтобы все художники на холсте (включая легенду) помещались в сохраненную область. При необходимости размер фигуры настраивается автоматически.В этом ответе можно найти способ автоматической настройки положения подзаголовка таким образом, чтобы легенда помещалась внутри холста без изменения размера фигуры . Создание фигуры с точным размером и без отступов (и легенда вне осей)
Сравнение между случаями, обсужденными выше:
альтернативы
Легенда фигуры
Можно использовать легенду для фигуры вместо осей
matplotlib.figure.Figure.legend
. Это стало особенно полезным для версии matplotlib> = 2.1, где не требуется никаких специальных аргументовсоздать легенду для всех художников по разным осям фигуры. Легенда размещается с использованием
loc
аргумента, аналогично тому, как он расположен внутри осей, но со ссылкой на всю фигуру - следовательно, он будет несколько вне осей автоматически. Осталось отрегулировать вспомогательные сюжеты так, чтобы не было перекрытия между легендой и осями. Здесь будет полезен пункт «Настройка параметров подзаговора» сверху. Пример:Легенда внутри выделенных осей вспомогательных сюжетов
Альтернативой использованию
bbox_to_anchor
будет размещение легенды в выделенных осях вспомогательных сюжетов (lax
). Поскольку вспомогательный сюжет должен быть меньше сюжета, мы можем использовать егоgridspec_kw={"width_ratios":[4,1]}
при создании осей. Мы можем скрыть оси,lax.axis("off")
но все же поместить легенду. Дескрипторы и метки легенды должны быть получены из реального сюжета черезh,l = ax.get_legend_handles_labels()
, а затем могут быть переданы легенде вlax
подзаговореlax.legend(h,l)
. Полный пример ниже.Это создает сюжет, который визуально очень похож на сюжет сверху:
Мы также можем использовать первые оси для размещения легенды, но использовать
bbox_transform
оси легенды,При таком подходе нам не нужно получать маркеры легенды извне, но нам нужно указать
bbox_to_anchor
аргумент.Дальнейшее чтение и заметки:
loc
Аргумент может принимать цифры вместо строки, которые делают звонки короче, тем не менее, они не очень интуитивно сопоставляются друг с другом. Вот отображение для справки:источник
fig.tight_layout
. Если вы используетеplt.subplots
для создания осей, просто дайте ему что-то вродеgridspec_kw={'height_ratios': [100, 1]}
(или width_ratios), чтобы оси легенды были крошечными ... Затемfig.tight_layout()
разверните их до нужного размера. По крайней мере для matplotlib 3.0.3.Просто позвоните
legend()
позвоните послеplot()
звонка, как это:Результаты будут выглядеть примерно так:
источник
Чтобы разместить легенду вне области сюжета, используйте
loc
иbbox_to_anchor
ключевые словаlegend()
. Например, следующий код поместит легенду справа от области графика:Для получения дополнительной информации см. Руководство легенды
источник
plt.tight_layout()
?Краткий ответ: вы можете использовать
bbox_to_anchor
+bbox_extra_artists
+bbox_inches='tight'
.Более длинный ответ: Вы можете использовать,
bbox_to_anchor
чтобы вручную указать расположение поля легенды, как некоторые другие люди указали в ответах.Однако обычная проблема заключается в том, что поле легенды обрезается, например:
Чтобы предотвратить обрезку поля легенды, при сохранении рисунка вы можете использовать параметры
bbox_extra_artists
иbbox_inches
попроситьsavefig
включить обрезанные элементы в сохраненное изображение:fig.savefig('image_output.png', bbox_extra_artists=(lgd,), bbox_inches='tight')
Пример (я только изменил последнюю строку, чтобы добавить 2 параметра
fig.savefig()
):Хотелось бы, чтобы matplotlib изначально разрешал внешнее местоположение для блока легенды, как это делает Matlab :
источник
bbox_inches='tight'
у меня отлично работает даже без bbox_extra_artistВ дополнение ко всем отличным ответам здесь, новые версии
matplotlib
иpylab
могут автоматически определять, куда поместить легенду, не вмешиваясь в сюжеты , если это возможно.Это автоматически поместит легенду от данных, если это возможно!
Однако, если нет места для размещения легенды без наложения данных, вам нужно попробовать один из других ответов; Использование
loc="best"
никогда не поставит легенду за пределы сюжета.источник
Краткий ответ : вызывайте перетаскиваемую легенду и перемещайте ее в интерактивном режиме, куда хотите:
Длинный ответ : Если вы предпочитаете размещать легенду интерактивно / вручную, а не программно, вы можете переключить режим легенды с перетаскиванием, чтобы вы могли перетащить ее туда, куда вы хотите. Проверьте пример ниже:
источник
Не совсем то, что вы просили, но я нашел альтернативу для той же проблемы. Сделайте легенду полупрозрачной, вот так:
Сделайте это с:
источник
Как уже отмечалось, вы также можете разместить легенду на сюжете или слегка отодвинуть ее к краю. Вот пример использования API Plotly Python , созданный с помощью IPython Notebook . Я в команде.
Для начала вам нужно установить необходимые пакеты:
Затем установите Plotly:
Это создаст ваш график и позволит вам сохранить легенду внутри самого графика. По умолчанию для легенды, если она не установлена, это поместить ее в график, как показано здесь.
Для альтернативного размещения вы можете точно выровнять край графика и границу легенды и удалить граничные линии для более точного соответствия.
Вы можете перемещать и изменять стиль легенды и графика с помощью кода или с помощью графического интерфейса. Чтобы переместить легенду, у вас есть следующие опции, чтобы расположить легенду внутри графика, присваивая значения x и y <= 1. Например:
{"x" : 0,"y" : 0}
-- Внизу слева{"x" : 1, "y" : 0}
-- Внизу справа{"x" : 1, "y" : 1}
-- В правом верхнем углу{"x" : 0, "y" : 1}
-- Верхний левый{"x" :.5, "y" : 0}
- Нижний Центр{"x": .5, "y" : 1}
- Топ ЦентрВ этом случае мы выбираем верхний правый угол
legendstyle = {"x" : 1, "y" : 1}
, также описанный в документации :источник
Что-то в этом роде помогло мне. Начиная с небольшого кода, взятого у Джо, этот метод изменяет ширину окна, чтобы автоматически соответствовать легенде справа от рисунка.
источник
mgr.window.wm_geometry(...)
наmgr.window.setFixedWidth(winWidthNew)
.fig.set_size_inches(...)
заботится о том, чтобы изменить размер вам нужно.Стоит обновить этот вопрос, поскольку более новые версии Matplotlib значительно упростили размещение легенды за пределами сюжета. Я создал этот пример с версией Matplotlib
3.1.1
.Пользователи могут передать 2
loc
параметра координат параметру, чтобы расположить легенду в любом месте ограничительной рамки. Единственное, что вам нужно - это запуститьplt.tight_layout()
matplotlib для пересчета размеров графика, чтобы легенда была видимой:Это приводит к следующему сюжету:
Ссылки:
источник
Вы также можете попробовать
figlegend
. Можно создать легенду независимо от любого объекта Оси. Однако вам может понадобиться создать несколько «фиктивных» путей, чтобы убедиться, что форматирование объектов передается правильно.источник
Вот пример из учебника по matplotlib, найденного здесь . Это один из более простых примеров, но я добавил прозрачность в легенду и добавил plt.show (), чтобы вы могли вставить это в интерактивную оболочку и получить результат:
источник
Решение, которое работало для меня, когда у меня была огромная легенда, состояло в том, чтобы использовать дополнительный пустой макет изображения. В следующем примере я сделал 4 строки, а внизу я нанесу изображение со смещением для легенды (bbox_to_anchor) вверху, оно не обрезается.
источник
Вот еще одно решение, похожее на добавление
bbox_extra_artists
иbbox_inches
где вам не нужно, чтобы ваши дополнительные художники были в рамках вашегоsavefig
звонка. Я придумал это, так как я генерирую большую часть своего графика внутри функций.Вместо того, чтобы добавлять все свои дополнения в ограничивающий прямоугольник, когда вы хотите их записать, вы можете добавлять их заранее
Figure
художникам. Используя что-то похожее на ответ Франка Дернонкура выше :Вот сгенерированный сюжет.
источник
не знаю, разобрались ли вы уже с вашей проблемой ... возможно, да, но ... я просто использовал строку 'outside' для местоположения, как в matlab. Я импортировал pylab из matplotlib. увидеть код следующим образом:
Нажмите, чтобы увидеть сюжет
источник