Domanda

Il toolkit di Chaco Plotting per Python include esempi che mostrano come dinamicamente aggiornare Trame esistenti. Tuttavia, la mia applicazione richiede che io Crea e distruggi dinamicamente trame a seconda dei dati. Sono nuovo nella programmazione con Chaco e tratti, quindi un semplice esempio che illustra come farlo sarebbe davvero utile.

È stato utile?

Soluzione

Questo è un po 'tardi, ma ecco un esempio che crea e distrugge le trame di Chaco. L'interfaccia principale è PlotSelector, che definisce alcuni dati falsi e pulsanti di radio per passare da due diversi stili a trama (linea e diagrammi a barre).

Questo esempio utilizza un evento tratti per segnalare quando chiudere un diagramma, quindi gestisce quel segnale con PlotController. Potrebbe esserci un modo migliore per chiudere la finestra, ma non sono riuscito a trovarne una.

Modificare: Importazioni aggiornate per le versioni più recenti di tratti, chaco e abilitazione (ETS 4 anziché 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()

Si noti che l'interfaccia principale (PlotSelector) chiamate configure_traits (inizia l'applicazione), mentre i grafici sono visualizzati con edit_traits (chiamato dall'interno dell'applicazione). Inoltre, si noti che questo esempio chiama edit_traits da PlotController Invece di chiamarlo dal modello. Potresti invece spostare la vista da PlotController a BasicPlot e impostare il metodo di gestore di quella vista PlotController.

Infine, se non hai bisogno di distruggere totalmente la finestra della trama, allora potresti voler guardare il Plot oggetto delplot metodo, che distrugge il *sub*Trama (qui la trama della linea o la trama a barre).

Spero che aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top