Das Chaco-Diagrammwerkzeug für Python enthält Beispiele, die zeigen, wie man bestehende Diagramme dynamisch aktualisiert. Allerdings erfordert meine Anwendung, dass ich Diagramme dynamisch erstelle und zerstöre, abhängig von den Daten. Ich bin neu in der Programmierung mit Chaco und Traits, daher wäre ein einfaches Beispiel, das zeigt, wie man das macht, wirklich hilfreich.
Antwort
Zu viele Anzeigen?Dies ist etwas spät, aber hier ist ein Beispiel, das Chaco-Plots erstellt und zerstört. Die Hauptoberfläche ist PlotSelector
, der einige Fake-Daten und Optionsfelder definiert, um zwischen zwei verschiedenen Plot-Stilen (Linien- und Balkenplots) umzuschalten.
In diesem Beispiel wird ein Traits-Ereignis verwendet, um anzuzeigen, wann ein Plot geschlossen werden soll, und dieses Signal wird dann mit PlotController
behandelt. Es gibt vielleicht einen besseren Weg, um das Fenster zu schließen, aber ich konnte keinen finden.
Bearbeiten: Aktualisierte Importe für neuere Versionen von Traits, Chaco und Enable (ETS 4 anstelle von 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()
Beachten Sie, dass die Hauptoberfläche (PlotSelector
) configure_traits
aufruft (startet die Anwendung), während die Plots mit edit_traits
angesehen werden (wird von innerhalb der Anwendung aufgerufen). Beachten Sie auch, dass dieses Beispiel edit_traits
von PlotController
anruft, anstatt es vom Modell aus aufzurufen. Stattdessen könnten Sie die Ansicht von PlotController
in BasicPlot
verschieben und die Handler-Methode dieser Ansicht auf PlotController
setzen.
Schließlich, wenn Sie das Plot-Fenster nicht vollständig zerstören müssen, möchten Sie vielleicht die delplot
-Methode des Plot
-Objekts betrachten, die den *untergeordneten* Plot zerstört (hier der Linienplot oder Balkenplot).
Ich hoffe, das hilft.