Python 在Chaco中动态创建绘图

Python 在Chaco中动态创建绘图,python,plot,traits,enthought,chaco,Python,Plot,Traits,Enthought,Chaco,Chaco plotting toolkit for Python包含显示如何动态更新现有绘图的示例。但是,我的应用程序要求我根据数据动态创建和销毁绘图。我对Chaco和Traits的编程还不熟悉,所以一个简单的例子来说明如何做到这一点会非常有帮助。这有点晚了,但这里有一个创建和销毁Chaco情节的例子。主界面是PlotSelector,它定义了一些伪数据和单选按钮,用于在两种不同的打印样式(直线和条形打印)之间切换 此示例使用Traits事件发出关闭绘图的信号,然后使用PlotControll

Chaco plotting toolkit for Python包含显示如何动态更新现有绘图的示例。但是,我的应用程序要求我根据数据动态创建和销毁绘图。我对Chaco和Traits的编程还不熟悉,所以一个简单的例子来说明如何做到这一点会非常有帮助。

这有点晚了,但这里有一个创建和销毁Chaco情节的例子。主界面是
PlotSelector
,它定义了一些伪数据和单选按钮,用于在两种不同的打印样式(直线和条形打印)之间切换

此示例使用Traits事件发出关闭绘图的信号,然后使用
PlotController
处理该信号。也许有更好的办法来关窗户,但我找不到

编辑:更新了Traits、Chaco和Enable(ETS 4而不是3)新版本的导入

请注意,主界面(
PlotSelector
)调用
configure\u traits
(启动应用程序),同时使用
edit\u traits
(从应用程序内调用)查看绘图。另外,请注意,此示例从
PlotController
调用
edit\u traits
,而不是从模型调用它。您可以将视图从
PlotController
移动到
basiclot
,并将该视图的处理程序方法设置为
PlotController

最后,如果不需要完全销毁绘图窗口,则可能需要查看
plot
对象的
delplot
方法,该方法将销毁*sub*绘图(此处为线绘图或条形图)


我希望这会有帮助。

你的意思是,你甚至不想在需要绘图之前看到绘图框,也不想在需要销毁绘图框时删除绘图框?这并不是说我不想看到绘图框,而是数据控制绘图的数量,而这个数字可以随时间而变化,所以我不能提前创建帧。你有没有想过该怎么做?对不起,我现在没有时间给出一个好的答案。但是这一页上的教程真的帮不了你吗@K.-Michael Aye:你提供的链接已经失效。这是对的吗?@K.-MichaelAye今天是404。
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()