Как развернуть окно plt.show () с помощью Python


95

Просто из любопытства я хотел бы узнать, как это сделать в приведенном ниже коде. Я искал ответ, но бесполезен.

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
Спойлер, работающий на винде: 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 .


66
Используя это, я попадаю mng.frame.Maximize(True) AttributeError: FigureManagerTkAgg instance has no attribute 'frame'в Matplotlib 1.2.0
Junuxx,

2
Он работает с backend wx, я обновил сообщение соответствующим образом. Вероятно, используемый вами бэкэнд Tk не поддерживает эту функцию. Есть ли у вас возможность изменить бэкэнд matplotlib на wx?
gg349

11
ошибка на Mac: mng.frame.Maximize (True) AttributeError: объект 'FigureManagerMac' не имеет атрибута 'frame'
user391339

7
Есть ли известное решение для этого на MacOSXсервере? FigureManagerMac, Кажется, не имеют ни атрибут , windowни frame.
McLawrence

3
У меня такая же проблема с Windows
RollRoll

169

Я использую Windows (WIN7), использую Python 2.7.5 и Matplotlib 1.3.1.

Я смог развернуть окна Figure для 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

77

С бэкэндом Qt (FigureManagerQT) правильная команда:

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

1
Это еще нужно plt.show()потом. Отличный ответ, работает на окнах!
lucidbrot

У объекта _tkinter.tkapp есть биатрибут showMaximized. Всегда более убежден, что Python - это скорее шутка, чем язык
HAL9000

1
@ HAL9000 Во-первых, это для Qt4, а не для Tk. Во-вторых, вы обвиняете язык в проблеме внешнего дизайна упаковки. У вас может быть такая проблема на любом языке.
Джефф Лирман

Я попадаю AttributeError: '_tkinter.tkapp' object has no attribute 'showMaximized'в винду.
Basj

45

Это заставляет окно занимать для меня весь экран в 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 мониторами.
Михаил Литвин

40

У меня ничего из вышеперечисленного не работало. Я использую бэкэнд 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.
Irene

1
Работает как шарм над Распбианом (Джесси)
анатол 09

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'.

Затем я просмотрел атрибуты mngи обнаружил следующее:

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
Джордж Сп,

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


Это объясняет, какую клавишу я продолжал случайно нажимать, чтобы окна отображались на весь экран! (И как это
исправить

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.