Como maximizar uma janela plt.show () usando Python

99

Só por curiosidade gostaria de saber como fazer isso no código abaixo. Tenho procurado uma resposta, mas é inútil.

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()
Santiago Lovera
fonte
5
Spoiler, trabalhando no Windows: plt.get_current_fig_manager().window.state('zoomed')então plt.show().
Basj
1
não funciona para mim
Johan

Respostas:

38

Eu costumo usar

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

antes da chamada para plt.show()e eu obtenho uma janela maximizada. Isso funciona apenas para o back-end 'wx'.

EDITAR:

para backend Qt4Agg, veja a resposta de kwerenda .

gg349
fonte
68
Usando isso, eu obtenho mng.frame.Maximize(True) AttributeError: FigureManagerTkAgg instance has no attribute 'frame'Matplotlib 1.2.0
Junuxx
2
Funciona com o backend wx, atualizei o post de acordo. Provavelmente, o backend do Tk que você está usando não suporta esse recurso. Você tem a opção de alterar o back-end matplotlib para 'wx'?
gg349
12
erro no mac: mng.frame.Maximize (True) AttributeError: O objeto 'FigureManagerMac' não tem atributo 'frame'
user391339
9
Existe uma solução conhecida para fazer isso no MacOSXback - end? O FigureManagerMacparece não ter o atributo windownem frame.
McLawrence
3
Tenho o mesmo problema no Windows
RollRoll
171

Estou em um Windows (WIN7), executando Python 2.7.5 e Matplotlib 1.3.1.

Consegui maximizar as janelas de figura para TkAgg, QT4Agg e wxAgg usando as seguintes linhas:

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()

Espero que este resumo das respostas anteriores (e algumas adições) combinado em um exemplo de trabalho (pelo menos para Windows) ajude. Felicidades

Pythonio
fonte
7
### funciona no Ubuntu ??? >> NÃO funcionou no windows mng.resize (* mng.window.maxsize ()) #funciona perfeito no linux para mim
Daniele
1
@Daniele, sua solução funciona para mim no TkAgg no Ubuntu. Obrigado! Mas demorei um pouco para analisar;) Talvez se livrar de tudo antes de "mng.resize ..."
BenB,
1
Existe uma maneira fácil de verificar qual back-end você está usando? meio que usei erro de final de teste agora.
Rutger Hofste
1
Infelizmente, tentei seu código com Qt5Agg, quando digito figManager.window.showMaximized(), a janela maximizada de tela inteira simplesmente apareceu. A próxima linha: plt.show()apenas mostre outra janela que plota os dados em uma janela de tamanho normal.
StayFoolish
3
A solução baseada em Tk não funciona para mim: _tkinter.TclError: bad argument "zoomed": must be normal, iconic, or withdrawn(Ubuntu 16.04).
bluenote10
78

Com o backend Qt (FigureManagerQT), o comando adequado é:

figManager = plt.get_current_fig_manager()
figManager.window.showMaximized()
Kwerenda
fonte
1
Isso ainda requer plt.show()depois. Ótima resposta, porém, funciona no Windows!
lucidbrot
O objeto '_tkinter.tkapp' tem um atributo bi 'showMaximized'. Sempre mais convencido de que Python é mais uma piada do que uma linguagem
HAL9000
1
@ HAL9000 Primeiro, isso é para Qt4, não Tk. Em segundo lugar, você está culpando uma linguagem por um problema externo de design de embalagem. Você pode ter esse tipo de problema em qualquer idioma.
Jeff Learman
2
Eu entro AttributeError: '_tkinter.tkapp' object has no attribute 'showMaximized'no Windows.
Basj
46

Isso faz com que a janela ocupe a tela inteira para mim, no Ubuntu 12.04 com o back-end TkAgg:

    mng = plt.get_current_fig_manager()
    mng.resize(*mng.window.maxsize())
Dan Christensen
fonte
6
Observe que isso tem efeitos estranhos em uma configuração de monitores múltiplos. A janela usará todos os monitores, em vez de ser maximizada.
user1202136
3
Isso não criará uma janela maximizada (que deve se encaixar nas bordas da tela), mas criará uma janela não maximizada com o tamanho de uma janela maximizada.
HelloGoodbye
Isso também maximiza com sucesso a janela no Ubuntu 14.04, mantendo a barra superior com os botões que todos nós conhecemos.
Irene de
Funciona no Ubuntu 16.04 e Linux mint. python2.7 testado
user1941407
@ user1202136 Funcionou bem para mim em uma configuração de 3 monitores.
Michael Litvin
40

Para mim, nada do acima funcionou. Eu uso o back-end Tk no Ubuntu 14.04 que contém matplotlib 1.3.1.

O código a seguir cria uma janela de plotagem em tela cheia que não é o mesmo que maximizar, mas atende perfeitamente ao meu propósito:

from matplotlib import pyplot as plt
mng = plt.get_current_fig_manager()
mng.full_screen_toggle()
plt.show()
peschü
fonte
1
Essa também foi a solução que funcionou para mim (embora vá para tela inteira, não janela maximizada). Executando no Redhat Enterprise Linux 6, python 2.7.10, matplotlib 1.4.3.
CrossEntropy,
1
Trabalhou para mim no Visual Studio 2015 no Windows 10 x64, python 3.5, exceto que não consegui acessar a borda da janela para fechar a figura, pois estava acima dos pixels da tela superior.
David Cuccia de
2
Para mim, isso também não cria uma janela maximizada, mas uma tela inteira. Não recebi nenhum botão minimizar, maximizar / restaurar para baixo e fechar como as janelas normais e tive que clicar com o botão direito do mouse na janela na barra de tarefas para poder fechá-la.
HelloGoodbye
1
Isso vai para tela inteira sem mostrar os botões que todas as janelas possuem. Tentei no Ubuntu 14.04.
Irene de
1
Trabalhando como um encanto em Raspbian (
Jessie
37

Isso deve funcionar (pelo menos com TkAgg):

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

(adotado acima e usando o Tkinter, há uma maneira de obter o tamanho de tela utilizável sem aumentar visivelmente uma janela? )

Dinvlad
fonte
1
Yay! Isso funcionou para mim; ele cria uma janela maximizada que se encaixa nas bordas da tela e tem os botões minimizar, maximizar / restaurar para baixo e fechar como deveria.
HelloGoodbye
1
Porém, você quer dizer que isso funciona com TkAgg, não TkApp, certo?
HelloGoodbye
Boa captura (provavelmente um erro de digitação)! TkAgg é um backend para Tk.
dinvlad de
3
Acabei de testar isso para matplotlib 2 / python 3. Funciona sob o Windows!
not_a_bot_no_really_82353
7

Isso é meio hacky e provavelmente não portátil, use-o apenas se estiver procurando algo rápido e sujo. Se eu apenas definir a figura muito maior do que a tela, ele ocupa exatamente a tela inteira.

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

Na verdade, no Ubuntu 16.04 com Qt4Agg, ele maximiza a janela (não em tela inteira) se for maior que a tela. (Se você tiver dois monitores, ele apenas maximiza em um deles).

Marca
fonte
Funciona para mim! Enquanto estou tentando obter o tamanho da tela.
StayFoolish
7

Encontrei isso para o modo de tela inteira no Ubuntu

#Show full screen
mng = plt.get_current_fig_manager()
mng.full_screen_toggle()
Westly White
fonte
6

Eu também entendo mng.frame.Maximize(True) AttributeError: FigureManagerTkAgg instance has no attribute 'frame'.

Então eu olhei através dos atributos mnge encontrei o seguinte:

mng.window.showMaximized()

Isso funcionou para mim.

Portanto, para pessoas que têm o mesmo problema, você pode tentar isso.

A propósito, minha versão do Matplotlib é 1.3.1.

Alan Wang
fonte
Obrigado! Essa solução funcionou bem para mim. Executando no Redhat Enterprise Linux 6, python 2.7.10, matplotlib 1.4.3.
CrossEntropy,
Eu sei que isso irá abrir uma janela em tela cheia, mas meus gráficos aparecerão em uma janela separada quando eu digitar plt.show(). Não nesta janela em tela cheia, alguma sugestão?
StayFoolish
Ele também funciona em python 3.6 no Debian e com backend Qt.
pbalaga
isso não funciona no Windows 10 64bit com python 3.7
George Sp
5

A única solução que funcionou perfeitamente no 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()
Zeds zen
fonte
5

Meu melhor esforço até agora, suportando back-ends diferentes:

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)
Martin R.
fonte
3

Pressionar a ftecla (ou ctrl+fem 1.2rc1) quando focado em um gráfico irá exibir uma janela de gráfico em tela cheia. Não totalmente maximizado, mas talvez melhor.

Além disso, para realmente maximizar, você precisará usar comandos específicos do GUI Toolkit (se eles existirem para o seu backend específico).

HTH

Pelson
fonte
Isso explica qual tecla eu continuei batendo acidentalmente que deixava minhas janelas em tela cheia! (E como desfazê-lo.)
cxrodgers
2

Em minhas versões (Python 3.6, Eclipse, Windows 7), os snippets fornecidos acima não funcionaram, mas com dicas fornecidas por Eclipse / pydev (após digitar: mng.), Descobri:

mng.full_screen_toggle()

Parece que usar comandos mng é bom apenas para desenvolvimento local ...

Antti A
fonte
2

Tente usar o método 'Figure.set_size_inches', com o argumento de palavra-chave extra forward=True. De acordo com a documentação , isso deve redimensionar a janela da figura.

Se isso realmente acontecer, dependerá do sistema operacional que você está usando.

Roland Smith
fonte
2

Aqui está uma função baseada na resposta de @Pythonio. Eu o encapsulo em uma função que detecta automaticamente qual backend ele está usando e faço as ações correspondentes.

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()
ch271828n
fonte
1

Tente plt.figure(figsize=(6*3.13,4*3.13))tornar o enredo maior.

Navin
fonte
1

Ok, então isso é o que funcionou para mim. Eu fiz toda a opção showMaximize () e ela redimensiona sua janela em proporção ao tamanho da figura, mas não expande e 'cabe' na tela. Eu resolvi isso por:

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

plt.show()
ArmandduPlessis
fonte
1

Para back-end baseado em Tk (TkAgg), essas duas opções maximizam e exibem em tela inteira a janela:

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

Ao plotar em várias janelas, você precisa escrever isso para cada janela:

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()

Aqui, ambas as 'figuras' são plotadas em janelas separadas. Usando uma variável como

figure_manager = plt.get_current_fig_manager()

pode não maximizar a segunda janela, uma vez que a variável ainda se refere à primeira janela.

CRTejaswi
fonte
0

Isso não maximiza necessariamente sua janela, mas a redimensiona proporcionalmente ao tamanho da figura:

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

Isso também pode ajudar: http://matplotlib.1069221.n5.nabble.com/Resizing-figure-windows-td11424.html

Blairg23
fonte
0

O seguinte pode funcionar com todos os back-ends, mas testei apenas no 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()
MikeTeX
fonte
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()

Então chame a função maximize()antesplt.show()

Adhun Thalekkara
fonte
Não funciona com 2 monitores. Ele simplesmente muda o local da janela para o tamanho da tela (não o tamanho do monitor) e também não o coloca no pixel superior esquerdo da tela. A solução @ ch271828n funcionou bem
Alex
0

Para backend GTK3Agg , use maximize()- principalmente com m minúsculo :

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

Testado no Ubuntu 20.04 com Python 3.8.

shredEngineer
fonte