Динамически создавать графики в Чако

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


person Andreas    schedule 22.02.2012    source источник
comment
Вы имеете в виду, что вы даже не хотите видеть рамку построения до того, как вам понадобится сюжет, и удалить рамку построения, когда ее пора уничтожить?   -  person K.-Michael Aye    schedule 26.03.2012
comment
Дело не столько в том, что я не хочу видеть кадр, а в том, что данные контролируют количество графиков, и это число может меняться со временем, поэтому я не могу создавать кадры заранее. . Любые мысли о том, как можно было бы сделать это?   -  person Andreas    schedule 27.03.2012
comment
Извините, сейчас нет времени на хороший ответ. Но туториалы на этой странице действительно вам не помогают? github.enthought.com/chaco/user_manual/tutorial.html   -  person K.-Michael Aye    schedule 31.03.2012
comment
@ K.-Michael Aye: предоставленная вами ссылка не работает. Правильно ли это: github.com/enthought/chaco/tree/master/ примеры/учебники?   -  person    schedule 12.05.2012
comment
@K.-MichaelAye Сегодня 404 года.   -  person Mast    schedule 16.01.2015
comment
docs.enthought.com/chaco/user_manual/   -  person K.-Michael Aye    schedule 16.01.2015


Ответы (1)


Это немного поздно, но вот пример, который создает и разрушает сюжеты Чако. Основной интерфейс — 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.

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

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

person Tony S Yu    schedule 16.06.2012