Установка размера фигуры больше размера экрана в matplotlib

Я пытаюсь создать цифры в 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 использовать запрошенный размер фигуры, даже если он превышает размеры моего экрана? Я использую спайдер.

Возможно, это не идеальное решение, но можете ли вы сохранить его как файл SVG, а затем открыть в чем-то вроде Inkscape и экспортировать в виде файла PNG соответствующего качества?

Andrew Guy 08.04.2019 06:25

@AndrewGuy только что попробовал height=9 и height=10 с test.svg вместо test.png - результирующие файлы были идентичными.

Pete 08.04.2019 07:01

Какой бэкенд вы используете? Беги import matplotlib; matplotlib.get_backend().

Andrew Guy 08.04.2019 07:11

Я использую Qt5Agg

Pete 08.04.2019 07:12

Я не могу воспроизвести эту проблему, используя тот же код в блокноте Jupyter, поэтому я подозреваю, что это связано с тем, какой бэкэнд вы используете для рисования фигуры. Может попробовать другой бэкенд?

Andrew Guy 08.04.2019 07:16

Например, запустите import matplotlib; matplotlib.use('Agg') в начале вашего скрипта.

Andrew Guy 08.04.2019 07:18

Это работает, спасибо @AndrewGuy!

Pete 08.04.2019 07:29

Я добавлю это как ответ. :)

Andrew Guy 08.04.2019 07:32

Проблема заключается в использовании spyder здесь. Если вы запустите код как сценарий из CLI, он будет работать, как и ожидалось. Spyder по умолчанию включает интерактивный режим, поэтому фигура «показывается» перед вызовом savefig. При показе он изменяется в соответствии с размером экрана. Использование бэкенда agg — одно из решений, потому что оно ничего не может показать. Отключение «поддержки matplotlib» в параметрах spyder — еще один вариант. Кроме того, возможно, простое добавление plt.ioff() может сработать (не проверено).

ImportanceOfBeingErnest 08.04.2019 13:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
9
3 129
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятно, это проблема с вашим бэкэндом для генерации сюжета.

Вы можете увидеть, какой бэкенд вы используете, запустив:

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 21.12.2020 20:04

@ Forklift17 Да, это ожидаемое поведение, если вы пытаетесь отобразить график в строке, а не сохранить в файл. См. этот вопрос для более подробной информации - stackoverflow.com/questions/4930524/…

Andrew Guy 23.12.2020 13:24

Другие вопросы по теме