2010-07-12 8 views
1

J'utilise scipy-cluster dans mon application. Il fournit une fonction pour tracer un dendrogramme de l'arborescence de la grappe hiérarchique. En regardant la source, je trouve qu'il trace finalement le dendrogramme en appelant draw_if_interactive. Comme on pouvait s'y attendre, cela fonctionne très bien dans une session interactive, mais quand je lance le script de manière non interactive, une fenêtre apparaît et disparaît immédiatement (j'ai configuré matplotlib pour utiliser le macosx-backend). J'ai besoin d'un moyen de faire attendre mon application jusqu'à ce que l'utilisateur ferme la fenêtre affichant le tracé, ou de le rendre directement dans un fichier (ce que je préférerais en fait). Encore une fois, le problème est, que je ne peux pas modifier le code qui génère le tracé, donc la solution impliquera probablement des paramètres de configuration pour matplotlib ou quelque chose comme ça.Tracé non interactif avec matplotlib sur Mac OS X

EDIT: J'ai ajouté ma solution de contournement actuelle en guise de réponse afin que d'autres personnes puissent l'utiliser. Comme c'est très moche, je vais laisser cette question ouverte en espérant que quelqu'un puisse trouver une meilleure solution.

Répondre

0

Alors, voici ce que je suis venu avec pour l'instant:

class myplot(object): 
    def __init__(self, filename): 
     self._filename = filename 

    def resetFileName(self, fileName): 
     self._filename = fileName 

    def __call__(self): 
     matplotlib.pylab.savefig(self._filename) 

plotfunction = myplot("foo.png") 
matplotlib.pylab.draw_if_interactive = plotfunction 

Cela doit être exécuté après la hcluster -module est importé. C'est moche à bien des égards, mais au moins (grâce à la nature dynamique de Python) je n'ai pas besoin de modifier le code source. Il me permet de définir le nom de fichier pour chaque intrigue, et c'est exactement ce dont j'ai besoin.

1

Le backend macosx ne prend pas en charge correctement le mode non-interactif (le réglage interactif désactivé n'a aucun effet). Vous pourriez préférer utiliser l'AGG backend pour cela -

import matplotlib 
matplotlib.use('AGG')