matplotlib - Dessin directement sur la toile
En raison de problèmes de performances pour les dynamiques mises à jour, j'ai besoin de dessiner directement beaucoup de rectangle sur la toile de très bas niveau, c'est-à-dire sans l'aide de matplotlib.patches
et que nous avons à faire avec classique GUI.
Plus précisément, je tiens à ne dessiner un rectangle et non seulement l'ensemble de la figure.
Est-il possible ?
Voici mon code de test en utilisant le lien donné par Joe kingston portant.
#!/usr/bin/env python3
from random import randint, choice
import time
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import matplotlib.colors as colors
import matplotlib
back_color = "black"
colors = ['red', 'green', 'cyan', 'yellow']
width = 16
height = 16
ax = plt.subplot(111)
canvas = ax.figure.canvas
ax.set_xlim([0, width])
ax.set_ylim([0, height])
def update():
global ax, canvas, colors, width, height
x = randint(0, width - 1)
y = randint(0, height - 1)
rect = mpatches.Rectangle(
(x, y), 1, 1,
facecolor = choice(colors),
edgecolor = back_color
)
start = time.time()
ax.draw_artist(rect)
canvas.blit(ax.bbox)
print("draw >>>", time.time() - start)
timer = canvas.new_timer(interval = 1)
timer.add_callback(update)
timer.start()
plt.show()
Sous Mac O$, j'obtiens le message suivant.
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/matplotlib/backend_bases.py", line 1203, in _on_timer
ret = func(*args, **kwargs)
File "/Users/xxx/test.py", line 86, in update
ax.draw_artist(rect)
File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/matplotlib/axes.py", line 2100, in draw_artist
a.draw(self._cachedRenderer)
File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/matplotlib/artist.py", line 56, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/matplotlib/patches.py", line 393, in draw
gc = renderer.new_gc()
File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/matplotlib/backends/backend_macosx.py", line 97, in new_gc
self.gc.save()
RuntimeError: CGContextRef is NULL
Pour Maverick utilisateurs
J'ai une bonne nouvelle pour les utilisateurs de Mac qui veulent jouer avec les codes suivants, et aussi avec des animations. J'ai réinstallé OS Maverick sur mon Mac sans aucune logiciels, cela s'appelle une installation propre, et puis je l'ai installé Anaconda, et XQuark (voir ce).
Pour réaliser des animations de travail, vous avez juste à utiliser les deux lignes suivantes avant toute autre matplotlib importations.
import matplotlib
matplotlib.use('TkAgg')
Je pense que cela fonctionne pour n'importe quel Mac OS pris en charge par l'Anaconda. L'utilisation de XQuark est seulement nécessaire pour Maverick.
Non, il travaille pour les patchs. Pouvez-vous montrer un exemple de ce que vous essayez?
J'ai mis un petit code de test avec le message d'erreur. Je suis sous Mac O$.
OriginalL'auteur | 2014-03-13
Vous devez vous connecter pour publier un commentaire.
Vous avez deux problèmes avec votre code actuel.
ax.draw_artist(rect)
.Voici un exemple de travail:
À ce point, cependant, de faire beaucoup plus de sens de ne pas ajouter un nouvel artiste chaque fois. Au lieu de cela, ajouter le rectangle initial et la mise à jour à chaque fois. Par exemple:
Je v juste testé avec succès sur Windows. Donc, pour le Mac O$, il y a un gros bug. Je vais la poster à la
matplotlib
liste de diffusion.Ouais, le OSX moteur peut être décalé. Si vous le pouvez, utilisez
TkAgg
,QtAgg
,GtkAgg
, etc, à la place. (c'est à dire neimport matplotlib; matplotlib.use('TkAgg')
avantimport matplotlib.pyplot as plt
) Si vous pouvez poster l'erreur spécifique, il peut être une simple solution de contournement.Quel gâchis ! Pas si courant dans mon idéal Python monde... je suis encore battu contre cela.
J'ai trouvé comment faire de vos codes de travailler sur mon Mac. J'ai mis à jour ma question.
OriginalL'auteur Joe Kington