2013-03-16 9 views
7

Jeśli korzystam z backendu Agg, nie mogę zachować otwartych okien obrazu przy pomocy show() (niezależnie od block=True lub nie) --- po prostu praktycznie natychmiast się zamykają. Jeśli nie używam Agg, wtedy pojawia się ostrzeżenie: kodpython matplotlib Agg vs. interaktywne kreślenie i tight_layout

/Library/Python/2.7/site-packages/matplotlib-1.2.0-py2.7-macosx-10.8-intel.egg/matplotlib/tight_layout.py:225: UserWarning: tight_layout : falling back to Agg renderer warnings.warn("tight_layout : falling back to Agg renderer")

Próbka:

import matplotlib as mpl 
mpl.use('Agg')  # With this line = figure disappears; without this line = warning 
import matplotlib.pyplot as plt 
import matplotlib.mlab as mlab 
import numpy as np 

fig = plt.figure() 
ax = fig.add_subplot(111) 
mu, sigma = 0, 0.5 
x = np.linspace(-3, 3, 100) 
plt.plot(x, mlab.normpdf(x, mu, sigma)) 
fig.tight_layout() 
plt.show() 

Czy istnieje inny backend lub metodologia I powinny być using?

+0

Jaki jest twój domyślny backend? Jeśli zrobisz 'import matplotlib jako mpl', a następnie' mpl.get_backend() ', co dostaniesz? Będzie to backend, którego używa, gdy nie określisz "Agg", i możesz być w stanie uzyskać to, czego chcesz, przełączając się na inny backend z jednego z tych dwóch. – BrenBarn

+0

@zhermes: czy w końcu znalazłeś pracę? Stoję w obliczu tego samego problemu. – nia

+2

Niezadowalającym rozwiązaniem jest usunięcie 'mpl.use ('Agg')' i użycie 'fig.set_tight_layout (True)' zamiast 'fig.tight_layout()' zgodnie z sugestią @FelipeCorreia – DilithiumMatrix

Odpowiedz

7

Obejście problemu, podane przez @FilipeCorreia in a comment, polega na usunięciu mpl.use('Agg') i użyciu fig.set_tight_layout(True) zamiast fig.tight_layout().

+0

Lub przy użyciu interfejsu nieobiektywnego, 'plt.gcf(). Set_tight_layout (True)' zamiast 'plt.tight_layout()'. –

+0

@ 1 '' Nie mów 'plt.tight_layout()', używam 'fig.tight_layout()' ... który jest * obiektem * zwracanym przez 'plt.gcf()'. – DilithiumMatrix

+1

Oczywiście, włączając ten komentarz dla osób, które znają tylko składnię 'plt.function()'. –

6

Agg to non-interactive backend, co oznacza, że ​​nie wyświetli się na ekranie, a jedynie zapisuje do plików. Którego backendu używasz? Masz OSX, może możesz wypróbować "macosx" lub interaktywny backend, który używa Agg (np. QT4Agg, WXAgg).

+0

Dzięki Tiago, próbowałem obu z nich i wciąż otrzymuję ten sam komunikat ostrzegawczy. Czego nie rozumiem, jeśli "wraca do AGG", dlaczego interaktywne spiski wciąż działają? – DilithiumMatrix

+8

Jeśli zdecydujesz się wybrać tryb interaktywny, możesz spróbować 'fig.set_tight_layout (True)' zamiast 'fig.tight_layout()'. Zobacz komentarze na [ten problem] (https://github.com/matplotlib/matplotlib/issues/1852) na github. –

+0

@FilipeCorreia Twoja sugestia działa nawet w przypadku używania nieinteraktywnego backendu innego niż Agg, takiego jak pdf. Czy możesz to opublikować jako odpowiedź? –

Powiązane problemy