Introdução
Nessa postagem mostrarei como instalar o PyLab
(pacote matplotlib
) no OpenSuse e também solucionar problemas comuns surgidos no processo.
Instalação
Precisamos instalar 3 pacotes. O python-tk
, python-matplotlib
e python-matplotlib-tk
. Na minha máquina o tamanho total foi de aproximadamente 70MB.
# zypper install python-tk python-matplotlib python-matplotlib-tk
Erro Comum #1
O pacote python-matplotlib-tk
é responsável por instalar aquela interface gráfica que aparece quando o método show()
é chamado. Essa interface gráfica recebe o nome de backend e pode ser mudada, como veremos a seguir.
Sem esse pacote instalado o seguinte erro é mostrado [1]:
In [63]: import pylab ————————————————————————— ImportError Traceback (most recent call last) in () —-> 1 import pylab /usr/lib64/python2.7/site-packages/pylab.py in () —-> 1 from matplotlib.pylab import * 2 import matplotlib.pylab 3 __doc__ = matplotlib.pylab.__doc__ /usr/lib64/python2.7/site-packages/matplotlib/pylab.py in () 263 from numpy.linalg import * 264 –> 265 from matplotlib.pyplot import * 266 267 # provide the recommended module abbrevs in the pylab namespace /usr/lib64/python2.7/site-packages/matplotlib/pyplot.py in () 95 96 from matplotlib.backends import pylab_setup —> 97 _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup() 98 99 @docstring.copy_dedent(Artist.findobj) /usr/lib64/python2.7/site-packages/matplotlib/backends/__init__.pyc in pylab_setup() 23 backend_name = ‘matplotlib.backends.%s’%backend_name.lower() 24 backend_mod = __import__(backend_name, —> 25 globals(),locals(),[backend_name]) 26 27 # Things we pull in from all backends ImportError: No module named backend_tkagg
Logo, se você tem erro semelhante, instale esse pacote.
Erro Comum #2
Esse erro acontece quando tudo está funcionando mas nada é mostrado na tela após um show()
. O motivo é que o backend setado por padrão pela instalação não corresponde a um backend gráfico.
Se você está com problema parecido, primeiro verifique qual o backend está setado como padrão:
$ python -c 'import matplotlib; import matplotlib.pyplot; print(matplotlib.backends.backend)'
Se a saída for:
Agg
então o backend Agg
está sendo usado. Esse backend é não interativo por isso nada é mostrado na tela após um show()
, embora ele ainda funcione usando savefig(...)
[2].
Temos que mudar esse backend e isso é feito alterando um arquivo de configuração. Para localizar esse arquivo, digite [3]:
$ python -c 'import matplotlib; print(matplotlib.matplotlib_fname())'
A saída em minha máquina foi:
/usr/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc
Vamos abrir esse arquivo e localizar a linha que começa com backend:
# vim /usr/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc ... backend: Agg
Troque backend: Agg
por backend: TkAgg. Salve o arquivo e teste seu script novamente e veja se a interface apareceu.
Bônus: Mudando o backend
Há vários backends disponíveis. Digite o seguinte comando para ver uma lista deles [3]:
$ python -c 'import matplotlib.rcsetup as rcsetup; print(rcsetup.all_backends)' [u'GTK', u'GTKAgg', u'GTKCairo', u'MacOSX', u'Qt4Agg', u'Qt5Agg', u'TkAgg', u'WX', u'WXAgg', u'CocoaAgg', u'GTK3Cairo', u'GTK3Agg', u'WebAgg', u'nbAgg', u'agg', u'cairo', u'emf', u'gdk', u'pdf', u'pgf', u'ps', u'svg', u'template']
Alguns deles não terão o pacote equivalente instalado. Em minha máquina, embora o GTKAgg
estivesse listado, o seu backend não estava disponível.
Para testar a mudança de backend, vou instalar o pacote python-matplotlib-gtk3
:
# zypper install python-matplotlib-gtk3
O seguinte backend foi instalado: Gtk3Agg
(basta conferir usando o comando de listagem).
Feito isso, temos que alterar o arquivo de configuração (no meu caso o /usr/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc
) trocando a linha para backend: Gtk3Agg
Depois é só rodar seu script teste e verificar as diferenças na modelagem da janela e também nos ícones.
Referências
[1] Problems with pylab and ipython on openSUSE – ImportError by mattos (Acessado em: Dezembro/2014)
http://www.mattos.eng.br/2013/10/01/problems-with-pylab-and-ipython-on-opensuse-importerror/
[2] Why matplotlib does not plot? by stackoverflow (Acessado em: Dezembro/2014)
http://stackoverflow.com/questions/14558843/why-matplotlib-does-not-plot
[3] matplotlib does not show my drawings although I call pyplot.show() by stackoverflow (Acessado em: Dezembro/2014)
http://stackoverflow.com/questions/7534453/matplotlib-does-not-show-my-drawings-although-i-call-pyplot-show
Cara, você absolutamente salvou a minha vida! Muito obrigado!
Fico feliz em ter ajudado, Carlos. Abraços