Crea dinamicamente trame in chaco
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.
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.