15 Stimmen

Dynamisch Diagramme in Chaco erstellen

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.

8voto

Tony S Yu Punkte 2703

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X