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.

Il semble que vous voulez juste utiliser blitting. Je n'ai pas de temps pour répondre à ce moment, mais qui ont un look à la "Animer sélectionné éléments de l'intrigue de la section" ici: wiki.scipy.org/Cookbook/Matplotlib/...
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