Динамически создавать участки в Чако - PullRequest
15 голосов
/ 22 февраля 2012

Набор инструментов для построения графиков Chaco для Python включает примеры, показывающие, как динамически обновить существующих графиков.Однако мое приложение требует, чтобы я динамически создавал и уничтожал графики в зависимости от данных.Я новичок в программировании с Chaco и Traits, поэтому простой пример, который иллюстрирует, как это сделать, был бы действительно полезен.

1 Ответ

8 голосов
/ 17 июня 2012

Это немного поздно, но вот пример, который создает и уничтожает графики Чако.Основным интерфейсом является PlotSelector, который определяет некоторые ложные данные и переключатели для переключения между двумя различными стилями графика (линейные и линейные графики).

В этом примере используется событие Traits, чтобы сигнализировать, когда закрывать графика затем обрабатывает этот сигнал с PlotController.Возможно, есть лучший способ закрыть окно, но я не смог его найти.

Редактировать : обновлен импорт для более новых версий Traits, Chaco и Enable (ETS 4 вместо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()

Обратите внимание, что основной интерфейс (PlotSelector) вызывает configure_traits (запускает приложение), а графики просматриваются с помощью edit_traits (вызывается из приложения).Также обратите внимание, что этот пример вызывает edit_traits из PlotController вместо вызова из модели.Вместо этого вы можете переместить представление из PlotController в BasicPlot и установить метод обработки этого представления в PlotController.

Наконец, если вам не нужно полностью разрушать окно графика, тогда выВозможно, вы захотите взглянуть на метод Plot объекта *1022*, который разрушает график * sub * (здесь линейный график или линейчатый график).

Надеюсь, это поможет.

...