Estou lutando com o seguinte problema. Preciso gerar relatórios que consistam em uma coleção de gráficos. Todos esses gráficos, exceto um, são feitos usando o backend padrão do Matplotlib (TkAgg). Um gráfico precisa ser feito usando o back-end do Cairo, a razão é que estou traçando um gráfico igraph e que só pode ser traçado usando o Cairo.
O problema é que não consigo alterar back-ends dinamicamente, por exemplo, o seguinte não funciona:
matplotlib.pyplot.switch_backend('cairo.png')
(sei que a funcionalidade switch_backend é experimental)
e eu também tentei, matplotlib.use("cairo.png")
mas isso leva a problemas de importação como omatplotlib.use("cairo.png")
instrução deve vir antes da importação matplotlib.pyplot
. mas preciso de dois back-ends diferentes ao longo da vida do script.
Então, minha pergunta é se alguém tem um trecho de código que mostra como alternar o back-end no Matplotlib?
Muito obrigado!
ATUALIZAÇÃO: escrevi um snippet que carrega matplotlib, mostra o back-end padrão, descarrega matplotlib, recarrega e altera o back-end:
import matplotlib
import matplotlib.pyplot as plt
import sys
print matplotlib.pyplot.get_backend()
modules = []
for module in sys.modules:
if module.startswith('matplotlib'):
modules.append(module)
for module in modules:
sys.modules.pop(module)
import matplotlib
matplotlib.use("cairo.png")
import matplotlib.pyplot as plt
print matplotlib.pyplot.get_backend()
mas essa é realmente a maneira de fazer isso?
ATUALIZAÇÃO 2: Eu tive um congelamento cerebral sério ontem ... A solução simples e mais óbvia é usar o back-end do Cairo para todos os gráficos e não mudar o back-end de forma alguma :)
ATUALIZAÇÃO 3: Na verdade, ainda é um problema, então qualquer pessoa que saiba como alternar dinamicamente os back-ends do matplotlib ... por favor, poste sua resposta.
fonte
pyplot.switch_backends()
. Pode não funcionar no seu caso.Respostas:
Seis anos depois, me deparei com um problema semelhante, ao tentar decidir qual
backend
estava disponível para uso.Este snippet de código funciona bem para mim:
import matplotlib gui_env = ['TKAgg','GTKAgg','Qt4Agg','WXAgg'] for gui in gui_env: try: print "testing", gui matplotlib.use(gui,warn=False, force=True) from matplotlib import pyplot as plt break except: continue print "Using:",matplotlib.get_backend() Using: GTKAgg
Como você pode deduzir, trocar o
backend
é tão simples quanto reimportarmatplotlib.pyplot
depois de forçar o novobackend
matplotlib.use('WXAgg',warn=False, force=True) from matplotlib import pyplot as plt print "Switched to:",matplotlib.get_backend() Switched to: WXAgg
Para aqueles que ainda estão tendo problemas, este código irá imprimir a:
lista de back-ends não Gui;
a lista de back-ends do Gui;
e tente usar cada back-end Gui para ver se ele está presente e funcionando.
import matplotlib gui_env = [i for i in matplotlib.rcsetup.interactive_bk] non_gui_backends = matplotlib.rcsetup.non_interactive_bk print ("Non Gui backends are:", non_gui_backends) print ("Gui backends I will test for", gui_env) for gui in gui_env: print ("testing", gui) try: matplotlib.use(gui,warn=False, force=True) from matplotlib import pyplot as plt print (" ",gui, "Is Available") plt.plot([1.5,2.0,2.5]) fig = plt.gcf() fig.suptitle(gui) plt.show() print ("Using ..... ",matplotlib.get_backend()) except: print (" ",gui, "Not found")
fonte
Existe um recurso "experimental":
import matplotlib.pyplot as plt plt.switch_backend('newbackend')
retirado do doc matplotlib .
fonte
Por que não apenas usar a
reload
funçãoimportlib.reload
interna ( no Python 3)?import matplotlib matplotlib.use('agg') matplotlib = reload(matplotlib) matplotlib.use('cairo.png')
fonte
python -c "import matplotlib.pyplot as plt; import matplotlib; from importlib import reload; matplotlib = reload(matplotlib); matplotlib.use('Agg')"
é isso?Portanto, não tenho certeza se é isso que você está procurando.
Você pode alterar seu backend através do arquivo matplotlibrc que contém certas configurações para seu matplotlib.
Em seu script você pode colocar:
matplotlib.rcParams['backend'] = 'TkAgg'
ou algo parecido para alternar entre back-ends.
fonte
~/.config/matplotlib/matplotlibrc
No meu caso (Windows 10 + python 3.7), a primeira resposta de @Rolf da Saxônia não funcionou muito bem. Em vez de tentar todos os ambientes disponíveis e configurar um deles no início, ou seja, logo após
import matplotlib
Tive que mudar o ambiente de 'Agg' para 'TkAgg' usando
matplotlib.use('TKAgg',warn=False, force=True)
logo antes do código onde eu realmente plotei, ou seja,
import matplotlib.pyplot as plt fig = plt.figure() # AND SO ON....
fonte
Para alterar permanentemente o back-end, você pode usar isto:
Primeiro localize o
matplotlibrc
arquivo:import matplotlib matplotlib.matplotlib_fname() # '/Users/serafeim/.matplotlib/matplotlibrc'
Abra o terminal e faça:
Edite o arquivo (se não existir use este comando:
touch matplotlib
para criá-lo):Adicione esta linha e salve:
fonte
Você também pode ter um processo Python diferente para fazer esse gráfico, possivelmente com a ajuda de pickle ou joblib .
fonte
Se você estiver usando um console IPython (inclusive no Spyder), poderá usar comandos mágicos integrados para alternar rapidamente os back-ends, por exemplo:
Obtenha uma lista de back-ends disponíveis para usar com o comando:
fonte