У меня такой сюжет:
fig,ax = plt.subplots(5,2,sharex=True,sharey=True,figsize=fig_size)
и теперь я хотел бы дать этому графику общие метки оси x и метки оси y. Под «общим» я подразумеваю, что должна быть одна большая метка по оси абсцисс под всей сеткой подзаголовков и одна большая метка по оси ординат справа. Я ничего не могу найти об этом в документации plt.subplots
, и мои поисковые запросы предполагают, что мне нужно plt.subplot(111)
начать с чего-то большого, но как мне тогда использовать свои подзаговоры 5 * 2 plt.subplots
?
python
matplotlib
jolindbe
источник
источник
Ответы:
Это похоже на то, что вы действительно хотите. Он применяет тот же подход, что и этот ответ, к вашему конкретному случаю:
источник
plt.text
. Вы создаете свои подсюжеты, а затем добавляете однобитовый сюжет, делаете его невидимым и маркируете его x и y.tight_layout
?tight_layout
заменой0.04
на0
вроде работает.fig.text
- не лучшая идея. Это портит такие вещи, какplt.tight_layout()
Поскольку я считаю его актуальным и достаточно элегантным (не нужно указывать координаты для размещения текста), я копирую (с небольшой адаптацией) ответ на другой связанный с этим вопрос .
Это приводит к следующему (с matplotlib версии 2.2.0):
источник
constrained_layout=True
поскольку создает перекрывающиеся метки. В этом случае вам придется вручную настроить границы участков.Без
sharex=True, sharey=True
тебя получится:С ним у вас должно получиться получше:
Но если вы хотите добавить дополнительные метки, вы должны добавлять их только на краевые графики:
Добавление метки для каждого сюжета испортит его (возможно, есть способ автоматически обнаруживать повторяющиеся метки, но я не знаю ни одного).
источник
Поскольку команда:
вы использовали, возвращает кортеж, состоящий из фигуры и списка экземпляров осей, уже достаточно сделать что-то вроде (помните, что я изменил
fig,ax
наfig,axes
):Если вы хотите изменить некоторые детали на определенном подзаголовке, вы можете получить к нему доступ через
axes[i]
wherei
итерация по вашим подзаголовкам.Также было бы очень полезно включить
в конце файла, перед
plt.show()
, во избежание перекрытия меток.источник
plt.subplots()
создаст новый экземпляр фигуры. Если вы хотите придерживаться этой команды, вы можете легко добавитьbig_ax = fig.add_subplot(111)
, поскольку у вас уже есть фигура и вы можете добавить еще одну ось. После этого вы можете управлятьbig_ax
тем, как он отображается в ссылке из Hooked.none
, выполнив:big_ax.set_axis_bgcolor('none')
Вы также должны сделать цвет меткиnone
(в отличие от примера, связанного с Hooked):big_ax.tick_params(labelcolor='none', top='off', bottom='off', left='off', right='off')
AttributeError: 'numpy.ndarray' object has no attribute 'set_xlabel'
в выпискеax.set_xlabel('Common x-label')
. Вы можете понять это?Будет лучше, если вы зарезервируете место для общих меток, сделав невидимые метки для подзаголовка в нижнем левом углу. Также хорошо передать размер шрифта из rcParams. Таким образом, общие метки изменят размер в зависимости от вашей настройки rc, а оси также будут скорректированы, чтобы оставить место для общих меток.
источник
Я столкнулся с аналогичной проблемой при построении сетки графиков. Графики состояли из двух частей (верхней и нижней). Y-метка должна была располагаться по центру обеих частей.
Я не хотел использовать решение, которое зависит от знания позиции на внешнем рисунке (например, fig.text ()), поэтому я манипулировал y-позицией функции set_ylabel (). Обычно это 0,5, это прибавляется к середине графика. Поскольку отступ между частями (hspace) в моем коде был равен нулю, я мог вычислить середину двух частей относительно верхней части.
картина
Недостатки:
Горизонтальное расстояние до графика определяется по верхней части, нижние отметки могут заходить на метку.
В формуле не учитывается расстояние между частями.
Выдает исключение, если высота верхней части равна 0.
Вероятно, существует общее решение, учитывающее отступы между цифрами.
источник
Обновить:
Эта функция теперь является частью пакета proplot matplotlib, который я недавно выпустил на pypi. По умолчанию, когда вы делаете фигуры, метки «разделяются» между осями.
Оригинальный ответ:
Я обнаружил более надежный метод:
Если вы знаете
bottom
иtop
kwargs, которые вошли вGridSpec
инициализацию, или вы знаете положение краев ваших осей вFigure
координатах , вы также можете указать положение ylabel вFigure
координатах с помощью некоторой причудливой магии «преобразования». Например:... и вы должны увидеть, что метка по- прежнему соответствующим образом регулируется влево-вправо, чтобы не перекрываться с метками, как обычно, но теперь она будет регулироваться, чтобы всегда находиться точно между желаемыми подзаголовками.
Более того, если вы даже не используете
set_position
, ylabel по умолчанию будет отображаться ровно на полпути вверх по цифре . Я предполагаю, что это связано с тем, что, когда метка, наконец, нарисована,matplotlib
используется 0,5 дляy
-координаты без проверки, изменилось ли базовое преобразование координат.источник