2016-04-18 5 views
0

Ich folgte Speeding up Matplotlib -- Bastibe, um die Animation zu testen, indem ich nur aktualisierte, was sich in der Abbildung geändert hat. Und ich benutze Mac OS X 10.11.4, Python 3.4 von MacPorts installiert. Der Code sieht so aus:Matplotlib draw_artist (axis.patch) schlägt auf MacOSX-Backend fehl

'''Import modules''' 
import matplotlib.pyplot as plt 
import numpy as np 
import time 

'''Initialize figure and axis, perform first draw on canvas''' 
fig, ax = plt.subplots() 
line, = ax.plot(np.random.randn(100)) 
plt.show(block=False) 
fig.canvas.draw() 

'''Count how many plots made within 1 second''' 
tstart = time.time() 
num_plots = 0 
while time.time()-tstart < 1:   # within 1 second 
    line.set_ydata(np.random.randn(100)) # update line 
    ax.draw_artist(ax.patch)    # draw background 
    ax.draw_artist(line)     # draw line 
    fig.canvas.update()     # update canvas 
    fig.canvas.flush_events() 
    num_plots += 1      # count++ 
print(num_plots) 

Dieser Code auf Ubuntu 14.04 mit Python 3.4 + Qt5Agg Backend funktioniert gut. Aber auf Mac meldet es

Traceback (most recent call last): 
    File "./test.py", line 19, in <module> 
    ax.draw_artist(ax.patch) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/matplotlib/axes/_base.py", line 2340, in draw_artist 
    a.draw(self._cachedRenderer) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/matplotlib/artist.py", line 61, in draw_wrapper 
    draw(artist, renderer, *args, **kwargs) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/matplotlib/patches.py", line 486, in draw 
    gc = renderer.new_gc() 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/matplotlib/backends/backend_macosx.py", line 99, in new_gc 
    self.gc.save() 
RuntimeError: CGContextRef is NULL 

Irgendwelche Vorschläge werden geschätzt!

Antwort

2

Sie müssen ein anderes Backend verwenden. Fügen Sie diese Zeilen an den Anfang des Skripts:

import matplotlib 

matplotlib.use('Qt4Agg') 

Das gibt mir 283 Stellplätze, während fig.canvas.draw() gibt nur 26 Parzellen.

+0

Guter Rat Mike. Der Kernel muss neu gestartet werden, sonst beklagt sich matplotlib, dass 'matplotlib.use ('Qt4Agg')' keine Wirkung hat, da das Backend bereits ausgewählt wurde. Sie müssen auch das Plot 'plt.close()' schließen oder es wird dort hängen bleiben. –

+0

Vielen Dank dafür. Tatsächlich weiß ich, dass das Qt-Backend funktioniert, obwohl ich immer noch wissen möchte, was mit dem ursprünglichen MacOSX-Backend nicht stimmt. Oder sollte ich fragen, ob es einen Vorteil der Verwendung von Qt Backend anstelle der ursprünglichen gibt? – astroboylrx