Як максимізувати вікно plt.show () за допомогою Python


94

Для цікавості я хотів би знати, як це зробити в коді нижче. Я шукав відповідь, але марний.

import numpy as np
import matplotlib.pyplot as plt
data=np.random.exponential(scale=180, size=10000)
print ('el valor medio de la distribucion exponencial es: ')
print np.average(data)
plt.hist(data,bins=len(data)**0.5,normed=True, cumulative=True, facecolor='red', label='datos tamano paqutes acumulativa', alpha=0.5)
plt.legend()
plt.xlabel('algo')
plt.ylabel('algo')
plt.grid()
plt.show()

4
Спойлер, що працює на Windows: plt.get_current_fig_manager().window.state('zoomed')тоді plt.show().
Basj

1
у мене не працює
Йохан

Відповіді:


37

Я зазвичай використовую

mng = plt.get_current_fig_manager()
mng.frame.Maximize(True)

перед викликом plt.show(), і я отримую розгорнуте вікно. Це працює лише для бекенда 'wx'.

РЕДАГУВАТИ:

для бекенда Qt4Agg, див. відповідь kwerenda .


65
Користуючись цим, я потрапляю mng.frame.Maximize(True) AttributeError: FigureManagerTkAgg instance has no attribute 'frame'до Matplotlib 1.2.0
Junuxx

2
Це працює з бекендом wx, я відповідно оновив пост. Ймовірно, сервер Tk, який ви використовуєте, не підтримує цю функцію. У вас є можливість змінити бэккенд matplotlib на 'wx'?
gg349

11
помилка на mac: mng.frame.Maximize (True) AttributeError: 'FigureManagerMac' об'єкт не має атрибута 'frame'
user391339

7
Чи є відоме рішення зробити це у MacOSXсерверній системі? FigureManagerMac, Здається, НЕ мають ні атрибут , windowні frame.
McLawrence

2
У мене та сама проблема у Windows
RollRoll

170

Я працюю в ОС Windows (WIN7), працюючи на Python 2.7.5 і Matplotlib 1.3.1.

Мені вдалося розгорнути вікна малюнка для TkAgg, QT4Agg та wxAgg, використовуючи такі рядки:

from matplotlib import pyplot as plt

### for 'TkAgg' backend
plt.figure(1)
plt.switch_backend('TkAgg') #TkAgg (instead Qt4Agg)
print '#1 Backend:',plt.get_backend()
plt.plot([1,2,6,4])
mng = plt.get_current_fig_manager()
### works on Ubuntu??? >> did NOT working on windows
# mng.resize(*mng.window.maxsize())
mng.window.state('zoomed') #works fine on Windows!
plt.show() #close the figure to run the next section

### for 'wxAgg' backend
plt.figure(2)
plt.switch_backend('wxAgg')
print '#2 Backend:',plt.get_backend()
plt.plot([1,2,6,4])
mng = plt.get_current_fig_manager()
mng.frame.Maximize(True)
plt.show() #close the figure to run the next section

### for 'Qt4Agg' backend
plt.figure(3)
plt.switch_backend('QT4Agg') #default on my system
print '#3 Backend:',plt.get_backend()
plt.plot([1,2,6,4])
figManager = plt.get_current_fig_manager()
figManager.window.showMaximized()
plt.show()

Сподіваємось, цей підсумок попередніх відповідей (та деяких доповнень), об’єднаний у робочий приклад (принаймні для Windows), допоможе. Ура


7
### працює на Ubuntu ??? >> НЕ працював у Windows mng.resize (* mng.window.maxsize ()) # для мене ідеально працює на Linux
Даніеле,

1
@Daniele, твоє рішення працює для мене на TkAgg на Ubuntu. Дякую! Але на розбір мені знадобився деякий час;) Може, позбутися всього перед "mng.resize ...".
BenB

1
Чи є простий спосіб перевірити, яку серверну систему ви використовуєте? зараз використано помилку пробного завершення.
Рутгер Хофсте

1
На жаль, я спробував ваш код за допомогою Qt5Agg, коли я набираю текст, figManager.window.showMaximized()розгорнуте повноекранне вікно просто з’являється. Наступний рядок: plt.show()просто покажіть інше вікно, яке розміщує дані у вікні нормального розміру.
StayFoolish

3
Рішення на основі Tk для мене не працює: _tkinter.TclError: bad argument "zoomed": must be normal, iconic, or withdrawn(Ubuntu 16.04).
bluenote10,

78

З бекендом Qt (FigureManagerQT) належною командою є:

figManager = plt.get_current_fig_manager()
figManager.window.showMaximized()

1
Це все одно вимагає plt.show()згодом. Хоча чудова відповідь, працює на вікнах!
lucidbrot

Об'єкт '_tkinter.tkapp' має бі-атрибут 'showMaximized'. Завжди більш впевнений, що Python - це жарт більше, ніж мова
HAL9000,

1
@ HAL9000 По-перше, це для Qt4, а не для Tk. По-друге, ви звинувачуєте мову в тому, що є проблемою зовнішнього дизайну упаковки. Ви можете видавати такий випуск будь-якою мовою.
Джефф Лірман,

44

Це змушує вікно зайняти весь екран для мене, під Ubuntu 12.04 з серверною базою TkAgg:

    mng = plt.get_current_fig_manager()
    mng.resize(*mng.window.maxsize())

6
Зверніть увагу, що це має дивні наслідки для налаштування декількох моніторів. Вікно буде використовувати всі монітори, замість того, щоб розгорнути їх.
user1202136

2
Це не створить розгорнуте вікно (яке повинно прив'язуватися до країв екрана), але створить не розгорнуте вікно з розміром розгорнутого.
HelloGoodbye

Це також максимально розгортає вікно в Ubuntu 14.04, зберігаючи верхню панель кнопками, які ми всі знаємо.
Ірен

Працює на Ubuntu 16.04 та linux mint. python2.7 перевірено
user1941407

@ user1202136 У мене добре працювало в налаштуваннях із 3 моніторами.
Михайло Литвин

41

Для мене нічого з перерахованого не спрацювало. Я використовую сервер Tk на Ubuntu 14.04, який містить matplotlib 1.3.1.

Наступний код створює повноекранне вікно сюжету, яке не є таким самим, як розгортання, але воно чудово виконує мою мету:

from matplotlib import pyplot as plt
mng = plt.get_current_fig_manager()
mng.full_screen_toggle()
plt.show()

1
Це також було рішення, яке працювало для мене (хоча воно переходить у повноекранний режим, а не у розгорнуте вікно). Працює на Redhat Enterprise Linux 6, python 2.7.10, matplotlib 1.4.3.
CrossEntropy

1
Працював у мене в Visual Studio 2015 у Windows 10 x64, python 3.5, за винятком того, що я не міг отримати доступ до межі вікна, щоб закрити фігуру, як це було над пікселями верхнього екрана.
Девід Кучча

1
Для мене це також не створює розгорнуте вікно, а повноекранне. Я не отримав жодних кнопок мінімізації, розгортання / відновлення та закриття, як у звичайних вікнах, і мені довелося клацнути правою кнопкою миші на вікні на панелі завдань, щоб мати можливість його закрити.
HelloGoodbye

1
Це переходить у повноекранний режим, не показуючи кнопок кожного вікна. Пробував на Ubuntu 14.04.
Айрін

1
Працюючи як шарм на Raspbian (jessie)
анатол

37

Це має працювати ( принаймні з TkAgg):

wm = plt.get_current_fig_manager()
wm.window.state('zoomed')

(прийнято з вищезазначеного та за допомогою Tkinter, чи є спосіб отримати корисний розмір екрану без видимого масштабування вікна? )


1
Ага! Це спрацювало для мене; він створює розгорнуте вікно, яке прив'язується до країв екрана і має кнопки мінімізації, розгортання / відновлення та закриття, як слід.
HelloGoodbye

1
Однак ви маєте на увазі, що це працює з TkAgg, чи не так TkApp, правда?
HelloGoodbye

Хороший улов (можливо, друкарська помилка)! TkAgg - це серверна база для Tk.
dinvlad

3
Щойно перевірив це для matplotlib 2 / python 3. Працює під вікнами!
not_a_bot_no_really_82353

7

Це якийсь хакі і, мабуть, не портативний, використовуйте його, лише якщо ви шукаєте швидкого та брудного. Якщо я просто встановив цифру набагато більшу, ніж екран, вона займає рівно весь екран.

fig = figure(figsize=(80, 60))

Насправді, в Ubuntu 16.04 з Qt4Agg він розгортає вікно (не повноекранне), якщо воно більше, ніж екран. (Якщо у вас два монітори, це просто збільшує його на одному з них).


Працює для мене! Оскільки я намагаюся отримати розмір екрану.
StayFoolish

7

Я знайшов це для повноекранного режиму в Ubuntu

#Show full screen
mng = plt.get_current_fig_manager()
mng.full_screen_toggle()

6

Я теж отримую mng.frame.Maximize(True) AttributeError: FigureManagerTkAgg instance has no attribute 'frame'.

Потім я переглянув атрибути mnghas, і виявив таке:

mng.window.showMaximized()

Це спрацювало для мене.

Тож для людей, у яких такі самі проблеми, ви можете спробувати це.

До речі, моя версія Matplotlib - 1.3.1.


Дякую! Це рішення для мене добре працювало. Працює на Redhat Enterprise Linux 6, python 2.7.10, matplotlib 1.4.3.
CrossEntropy

Я знаю, що це з’явиться у повноекранному вікні, але мої графіки з’являться в окремому вікні, коли я набираю текст plt.show(). Не у цьому повноекранному вікні, є пропозиція?
StayFoolish

Він також працює на python 3.6 на Debian та з бекендом Qt.
pbalaga

це не працює на Windows 10 64bit з python 3.7
George Sp

4

Єдине рішення, яке працювало на Win 10 бездоганно.

import matplotlib.pyplot as plt

plt.plot(x_data, y_data)

mng = plt.get_current_fig_manager()
mng.window.state("zoomed")
plt.show()

4

Я доклав максимум зусиль, підтримуючи різні сервісні програми:

from platform import system
def plt_maximize():
    # See discussion: /programming/12439588/how-to-maximize-a-plt-show-window-using-python
    backend = plt.get_backend()
    cfm = plt.get_current_fig_manager()
    if backend == "wxAgg":
        cfm.frame.Maximize(True)
    elif backend == "TkAgg":
        if system() == "win32":
            cfm.window.state('zoomed')  # This is windows only
        else:
            cfm.resize(*cfm.window.maxsize())
    elif backend == 'QT4Agg':
        cfm.window.showMaximized()
    elif callable(getattr(cfm, "full_screen_toggle", None)):
        if not getattr(cfm, "flag_is_max", None):
            cfm.full_screen_toggle()
            cfm.flag_is_max = True
    else:
        raise RuntimeError("plt_maximize() is not implemented for current backend:", backend)

3

Натискання fклавіші (абоctrl+f в 1.2rc1) при фокусуванні на графіку призведе до повноекранного вікна сюжету. Не зовсім максимально, але, можливо, краще.

Крім цього, щоб насправді максимізувати, вам потрібно буде використовувати спеціальні команди GUI Toolkit (якщо вони існують для вашого конкретного серверного сервера).

HTH


Це пояснює, якою клавішею я випадково натискав, що повністю екранувало мої вікна! (І як це скасувати.)
cxrodgers

2

У моїх версіях (Python 3.6, Eclipse, Windows 7), наведені вище фрагменти не працювали, але з підказками Eclipse / pydev (після введення: mng.), Я виявив:

mng.full_screen_toggle()

Здається, що використання команд mng - це нормально лише для місцевого розвитку ...


2

Спробуйте скористатися методом 'Figure.set_size_inches' із додатковим аргументом ключового слова forward=True. Згідно з документацією , це повинно змінити розмір вікна малюнка.

Чи справді це станеться, залежатиме від операційної системи, якою ви користуєтесь.


2

Ось функція, заснована на відповіді @ Pythonio. Я інкапсулюю його у функцію, яка автоматично визначає, який серверний сервер він використовує, і виконую відповідні дії.

def plt_set_fullscreen():
    backend = str(plt.get_backend())
    mgr = plt.get_current_fig_manager()
    if backend == 'TkAgg':
        if os.name == 'nt':
            mgr.window.state('zoomed')
        else:
            mgr.resize(*mgr.window.maxsize())
    elif backend == 'wxAgg':
        mgr.frame.Maximize(True)
    elif backend == 'Qt4Agg':
        mgr.window.showMaximized()


1

Гаразд, так це мені вдалося. Я зробив весь параметр showMaximize (), і він змінює розмір вашого вікна пропорційно розміру малюнка, але він не розширюється і не підходить до полотна. Я вирішив це за допомогою:

mng = plt.get_current_fig_manager()                                         
mng.window.showMaximized()
plt.tight_layout()    
plt.savefig('Images/SAVES_PIC_AS_PDF.pdf') 

plt.show()

0

Це не обов’язково максимізує ваше вікно, але воно змінює розмір вашого вікна пропорційно розміру малюнка:

from matplotlib import pyplot as plt
F = gcf()
Size = F.get_size_inches()
F.set_size_inches(Size[0]*2, Size[1]*2, forward=True)#Set forward to True to resize window along with plot in figure.
plt.show() #or plt.imshow(z_array) if using an animation, where z_array is a matrix or numpy array

Це також може допомогти: http://matplotlib.1069221.n5.nabble.com/Resizing-figure-windows-td11424.html


0

Наступне може працювати з усіма серверними базами, але я перевірив це лише на QT:

import numpy as np
import matplotlib.pyplot as plt
import time

plt.switch_backend('QT4Agg') #default on my system
print('Backend: {}'.format(plt.get_backend()))

fig = plt.figure()
ax = fig.add_axes([0,0, 1,1])
ax.axis([0,10, 0,10])
ax.plot(5, 5, 'ro')

mng = plt._pylab_helpers.Gcf.figs.get(fig.number, None)

mng.window.showMaximized() #maximize the figure
time.sleep(3)
mng.window.showMinimized() #minimize the figure
time.sleep(3)
mng.window.showNormal() #normal figure
time.sleep(3)
mng.window.hide() #hide the figure
time.sleep(3)
fig.show() #show the previously hidden figure

ax.plot(6,6, 'bo') #just to check that everything is ok
plt.show()

0
import matplotlib.pyplot as plt
def maximize():
    plot_backend = plt.get_backend()
    mng = plt.get_current_fig_manager()
    if plot_backend == 'TkAgg':
        mng.resize(*mng.window.maxsize())
    elif plot_backend == 'wxAgg':
        mng.frame.Maximize(True)
    elif plot_backend == 'Qt4Agg':
        mng.window.showMaximized()

Потім зателефонуйте функції maximize()ранішеplt.show()


Не працює з 2 моніторами. Він просто змінює сайт вікна на розмір екрана (а не на розмір монітора), а також не розміщує його на лівому верхньому пікселі екрана. Рішення @ ch271828n спрацювало нормально
Алекс

0

Для бекенда GTK3Agg використовуйте maximize()- зокрема, з малою літерою m :

manager = plt.get_current_fig_manager()
manager.window.maximize()

Тестується в Ubuntu 20.04 за допомогою Python 3.8.


0

Для бекенда на базі Tk (TkAgg) ці два варіанти максимально розгортають і повністю екранують вікно:

plt.get_current_fig_manager().window.state('zoomed')
plt.get_current_fig_manager().window.attributes('-fullscreen', True)

При побудові графіку в декількох вікнах вам потрібно написати це для кожного вікна:

data = rasterio.open(filepath)

blue, green, red, nir = data.read()
plt.figure(1)
plt.subplot(121); plt.imshow(blue);
plt.subplot(122); plt.imshow(red);
plt.get_current_fig_manager().window.state('zoomed')

rgb = np.dstack((red, green, blue))
nrg = np.dstack((nir, red, green))
plt.figure(2)
plt.subplot(121); plt.imshow(rgb);
plt.subplot(122); plt.imshow(nrg);
plt.get_current_fig_manager().window.state('zoomed')

plt.show()

Тут обидві «фігури» побудовані в окремих вікнах. Використовуючи змінну, таку як

figure_manager = plt.get_current_fig_manager()

може не розгорнути друге вікно, оскільки змінна все ще посилається на перше вікно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.