Question

La boîte à outils de tracé Chaco pour Python comprend des exemples qui montrent comment dynamiquement mettre à jour parcelles existantes. Cependant, ma demande nécessite que je Créer et détruire dynamiquement les parcelles en fonction des données. Je suis nouveau dans la programmation avec le chaco et les traits, donc un exemple simple qui illustre comment procéder serait vraiment utile.

Était-ce utile?

La solution

C'est un peu en retard, mais voici un exemple qui crée et détruit les parcelles Chaco. L'interface principale est PlotSelector, qui définit quelques faux boutons de données et radio pour basculer entre deux styles de tracé différents (tracés de ligne et de bar).

Cet exemple utilise un événement de traits pour signaler quand fermer un tracé, puis gère ce signal avec PlotController. Il peut y avoir une meilleure façon de fermer la fenêtre, mais je n'ai pas pu en trouver.

Éditer: Importations mises à jour pour les versions plus récentes des traits, Chaco et Activer (ETS 4 au lieu de 3).

import numpy as np

import traits.api as traits
import traitsui.api as ui
import chaco.api as chaco
from enable.api import ComponentEditor


class PlotController(ui.Controller):
    view = ui.View(ui.Item('plot', editor=ComponentEditor(), show_label=False),
                   height=300, width=300, resizable=True)

    def object_close_signal_changed(self, info):
        info.ui.dispose()


class BasicPlot(traits.HasTraits):
    close_signal = traits.Event()
    plot = traits.Instance(chaco.Plot)


class LinePlot(BasicPlot):

    def __init__(self, plotdata):
        self.plot = chaco.Plot(plotdata)
        self.plot.plot(('x', 'y'))


class BarPlot(BasicPlot):

    def __init__(self, plotdata):
        self.plot = chaco.Plot(plotdata)
        self.plot.candle_plot(('x', 'ymin', 'ymax'))


available_plot_types = dict(line=LinePlot, bar=BarPlot)

class PlotSelector(traits.HasTraits):

    plot_type = traits.Enum(['line', 'bar'])
    traits_view = ui.View('plot_type', style='custom')

    def __init__(self, x, y):
        ymin = y - 1
        ymax = y + 1
        self.plotdata = chaco.ArrayPlotData(x=x, y=y, ymin=ymin, ymax=ymax)
        self.figure = None

    def _plot_type_changed(self):
        plot_class = available_plot_types[self.plot_type]
        if self.figure is not None:
            self.figure.close_signal = True
        self.figure = plot_class(self.plotdata)
        controller = PlotController(model=self.figure)
        controller.edit_traits()


N = 20
x = np.arange(N)
y = x + np.random.normal(size=N)
plot_selector = PlotSelector(x, y)
plot_selector.configure_traits()

Notez que l'interface principale (PlotSelector) appels configure_traits (démarre l'application), tandis que les parcelles sont visualisées avec edit_traits (appelé à partir de la demande). Notez également que cet exemple appelle edit_traits de PlotController au lieu de l'appeler à partir du modèle. Vous pourriez à la place déplacer la vue à partir de PlotController à BasicPlot et définir la méthode du gestionnaire de cette vue sur PlotController.

Enfin, si vous n'avez pas besoin de détruire totalement la fenêtre de l'intrigue, vous voudrez peut-être regarder le Plot objets delplot Méthode, qui détruit le *sous* Terrain (ici le tracé de ligne ou le tracé de la barre).

J'espère que cela aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top