Я пытаюсь создать цифры в matplotlib
, которые хорошо читаются в журнальной статье. У меня есть несколько больших рисунков (с подрисунками), которые я хотел бы занимать почти всю страницу в портретном режиме (в частности, 6,5 x 9 дюймов для полностраничного рисунка с полями 1 дюйм на бумаге формата Letter в США). Я могу установить размер фигуры легко с параметром figsize
.Однако фигура сжимается, если я устанавливаю размер фигуры больше, чем размер моего экрана (я работаю на 13-дюймовом ноутбуке); в частности, высота является проблемой. Размеры сохраненной фигуры не меняются, пока параметр height
ниже больше высоты моего экрана:
height = 9
fig, ax = plt.subplots(3, 2, figsize=(6.5, height))
plt.savefig('test.png') # size of this figure is independent of height
# if height > height of my screen
Как я могу заставить matplotlib
использовать запрошенный размер фигуры, даже если он превышает размеры моего экрана? Я использую спайдер.
@AndrewGuy только что попробовал height=9
и height=10
с test.svg
вместо test.png
- результирующие файлы были идентичными.
Какой бэкенд вы используете? Беги import matplotlib; matplotlib.get_backend()
.
Я использую Qt5Agg
Я не могу воспроизвести эту проблему, используя тот же код в блокноте Jupyter, поэтому я подозреваю, что это связано с тем, какой бэкэнд вы используете для рисования фигуры. Может попробовать другой бэкенд?
Например, запустите import matplotlib; matplotlib.use('Agg')
в начале вашего скрипта.
Это работает, спасибо @AndrewGuy!
Я добавлю это как ответ. :)
Проблема заключается в использовании spyder здесь. Если вы запустите код как сценарий из CLI, он будет работать, как и ожидалось. Spyder по умолчанию включает интерактивный режим, поэтому фигура «показывается» перед вызовом savefig
. При показе он изменяется в соответствии с размером экрана. Использование бэкенда agg
— одно из решений, потому что оно ничего не может показать. Отключение «поддержки matplotlib» в параметрах spyder — еще один вариант. Кроме того, возможно, простое добавление plt.ioff()
может сработать (не проверено).
Вероятно, это проблема с вашим бэкэндом для генерации сюжета.
Вы можете увидеть, какой бэкенд вы используете, запустив:
import matplotlib; matplotlib.get_backend()
Попробуйте изменить бэкэнд на что-то другое, например:
import matplotlib
matplotlib.use('Agg')
Обратите внимание, что это нужно запустить перед импортом matplotlib.pyplot
.
У меня не работает. Я получаю UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure. plt.show()
@ Forklift17 Да, это ожидаемое поведение, если вы пытаетесь отобразить график в строке, а не сохранить в файл. См. этот вопрос для более подробной информации - stackoverflow.com/questions/4930524/…
Возможно, это не идеальное решение, но можете ли вы сохранить его как файл SVG, а затем открыть в чем-то вроде Inkscape и экспортировать в виде файла PNG соответствующего качества?