Pregunta

El kit de herramientas de trazado de chaco para Python incluye ejemplos que muestran cómo dinámicamente actualizar parcelas existentes. Sin embargo, mi aplicación requiere que yo Dinámicamente crear y destruir gráficos dependiendo de los datos. Soy nuevo en la programación con chaco y rasgos, por lo que un ejemplo simple que ilustra cómo hacer esto sería realmente útil.

¿Fue útil?

Solución

Esto es un poco tarde, pero aquí hay un ejemplo que crea y destruye las parcelas de chaco. La interfaz principal es PlotSelector, que define algunos datos falsos y botones de radio para cambiar entre dos estilos de trazado diferentes (gráficos de línea y barra).

Este ejemplo utiliza un evento de rasgos para indicar cuándo cerrar una gráfica, y luego maneja esa señal con PlotController. Puede haber una mejor manera de cerrar la ventana, pero no pude encontrar una.

Editar: Importaciones actualizadas para versiones más nuevas de rasgos, chaco y habilitar (ETS 4 en lugar de 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()

Tenga en cuenta que la interfaz principal (PlotSelector) llamadas configure_traits (Aplicación de inicio), mientras que las parcelas se ven con edit_traits (llamado desde la aplicación). Además, tenga en cuenta que este ejemplo llama edit_traits de PlotController en lugar de llamarlo desde el modelo. En su lugar, podría mover la vista desde PlotController a BasicPlot y establezca el método del controlador de esa vista en PlotController.

Finalmente, si no necesita destruir totalmente la ventana de la trama, entonces es posible que desee mirar el Plot objetos delplot método, que destruye el *sub*Parcela (aquí la trama de línea o trama de barra).

Espero que eso ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top