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!
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. –
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