Como obtenho gráficos interativos novamente em Spyder / IPython / matplotlib?

91

Eu atualizei do Python (x, y) 2.7.2.3 para 2.7.6.0 no Windows 7 (e fiquei feliz em ver que finalmente posso digitar function_name?e ver a docstring no Inspetor de Objetos novamente), mas agora a plotagem não funciona como está costumava.

Anteriormente (Spyder 2.1.9, IPython 0.10.2, matplotlib 1.2.1), quando eu plotei este script , por exemplo, ele plotaria os subenredos lado a lado em uma janela interativa:

insira a descrição da imagem aqui

Agora (Spyder 2.2.5, IPython 1.2.0, Matplotlib 1.3.1), quando tento plotar as coisas, ele faz os subplots como pequenos PNGs embutidos, o que é uma mudança no IPython :

PNGs em linha minúsculos

Então, entrei em opções e encontrei o seguinte:

opções gráficas

o que parece dizer que posso obter os antigos tramas interativas de volta, com os 4 subtramas exibidos lado a lado, mas quando mudo para "Automático" e tento traçar algo, não faz nada. Nenhum enredo.

Se eu mudar este menu suspenso para Qt ou desmarcar "Ativar suporte", ele representa apenas a primeira subtrama, ou parte dela, e então para:

insira a descrição da imagem aqui

Como obtenho o antigo comportamento de 4 subtramas lado a lado em uma única figura com a qual posso interagir?

endolito
fonte
Acho que isso deve ir como um relatório de bug para o pythonxy. Meu palpite ingênuo é que eles estão usando pyplot para lidar com toda a trama e sendo mordidos na bunda por isso (o que parece errado, porque eles têm seu próprio widget de qt).
tacaswell
1
@tcaswell Quem são "eles" e o que usariam em vez de pyplot?
endolith de
1
Você pode reproduzir este problema fora do pythonxy (usando apenas ipython + qtconsole direto)? Não há informações suficientes aqui para descobrir o que está errado.
tacaswell
1
Eu acho que é um bug no Spyder (Spyder é o IDE, pythonxy é a distribuição).
Thomas K
1
@tcaswell: Aha. Parece que meu script está produzindo erros matplotlib que são enviados para algum lugar diferente do console IPython. Eles aparecem se eu usar o console Qt, e agora que procuro por ele, eles aparecem na guia Console regular do Spyder. Se eu fizer um script mais simples, ele funciona, seja máquina de estado ou orientado a objetos. Presumi que precisava alterar algumas configurações do IPython por causa dos novos gráficos embutidos.
endolith

Respostas:

134

Altere o back-end para automático:

Ferramentas> preferências> console IPython> Gráficos> Back-end de gráficos> Back-end: automático

Em seguida, feche e abra o Spyder.

Victor Arellano
fonte
27
O fechamento e a abertura são realmente necessários. Apenas me perguntando por que este não é o valor padrão.
Mathias711
5
Além disso, para quem ainda não está vendo seus gráficos (como eu não estava), a janela do gráfico pode estar aparecendo_behind_ silenciosamente em sua janela de console (pelo menos no Spyder no Windows 10), então você pode ter que procurar por sua janela.
Joshua Glazer
3
Para aqueles com dificuldade em encontrar isso, ele está localizado empython > preferences > IPython console > Graphics > Graphics backend > Backend: Automatic
cameronroytaylor
6
Em vez de reiniciar o Spyder, você também pode reiniciar o kernel (clicando na roda de configurações no console e em "Reiniciar kernel" ou por meio de um atalho de teclado (no Mac Cmd +.)
Michael
Não tenho ideia do motivo, mas mudar para Automático, reiniciar o Spyder e, em seguida, mudar para embutido fez com que os gráficos embutidos começassem a ser exibidos sempre que eu emitir um comando de entrada em um loop. Isso é muito útil!
Josiah Yoder
50

Você pode controlar isso rapidamente digitando comandos mágicos integrados no console IPython do Spyder, que acho mais rápido do que selecioná-los no menu de preferências. As alterações têm efeito imediato, sem a necessidade de reiniciar o Spyder ou o kernel.

Para mudar para gráficos "automáticos" (ou seja, interativos), digite:

%matplotlib auto

então, se você quiser voltar para "inline", digite o seguinte:

%matplotlib inline

(Observação: esses comandos não funcionam em consoles não IPython)

Veja mais informações sobre este tópico: Objetivo de "% matplotlib inline"

Mike T
fonte
Em Python 3.6, eu obtenhomatplotlib inline File "<stdin>", line 1 %matplotlib inline ^ SyntaxError: invalid syntax
Karlo
2
@Karlo esse erro é esperado de um interpretador "python" convencional. Esta sintaxe só é válida com ipython ou Spyder.
Mike T
OK, eu estava usando no Spyder, mas no console Python. Na verdade, ele funciona no console IPython.
Karlo
3
Existe uma maneira de configurá-lo usando um script? A saber, escolher onde está a saída do gráfico em um script? Obrigado.
Royi
1
Isso parece não funcionar no Spyder, embora seja a maneira de fazê-lo em uma janela IPython normal. Usar as preferências do menu funcionou para mim; não tenho certeza por que isso não acontece.
Turtles Are Cute
10

Após aplicar: Ferramentas> preferências> Gráficos> Backend> Automático Basta reiniciar o kernel insira a descrição da imagem aqui

E com certeza você obterá um gráfico interativo. Happy Coding!

Archit Pandey
fonte
5

Como disse nos comentários, o problema está no seu script. Na verdade, existem 2 problemas:

  • Há um erro matplotlib, acho que você está passando um argumento como None algum lugar. Talvez devido ao defaultdict?
  • Você chama show()após cada subtrama. show()deve ser chamado uma vez no final do seu script. A alternativa é usar o modo interativo, procure ionna documentação do matplotlib.
J. Martinot-Lagarde
fonte
2

Na verdade, isso é muito fácil de corrigir e não requer nenhuma codificação:

1.Clique na guia Plots acima do console. 2. Então, no canto superior direito da tela de plotagens, clique no botão de opções. 3. Por último, desmarque o botão "Silenciar plotagem embutida"

Agora execute novamente seu script e seus gráficos devem aparecer no console.

Felicidades.

Chris
fonte