在Chaco中动态创建图表

15

Python的Chaco绘图工具包含示例,展示如何动态更新现有的图表。然而,我的应用程序需要根据数据情况动态创建和销毁图表。由于我是使用Chaco和Traits编程的新手,因此一个简单的示例可以很有帮助。


你的意思是在需要绘图之前甚至不想看到绘图框架,并在需要销毁时删除绘图框架吗? - K.-Michael Aye
并不是我不想看到这个框架,而是数据控制了图形的数量,而且这个数量随时间变化,所以我不能提前创建这些框架。你有什么想法吗? - Andreas
1
抱歉,现在没有时间提供一个详细的答案。但是,这个页面上的教程真的对你没有帮助吗?http://github.enthought.com/chaco/user_manual/tutorial.html - K.-Michael Aye
@K.-Michael Aye:您提供的链接已失效。这是正确的链接吗:https://github.com/enthought/chaco/tree/master/examples/tutorials? - user268157
今天是404。 - Mast
http://docs.enthought.com/chaco/user_manual/tutorials_and_examples.html - K.-Michael Aye
1个回答

8
这有一个创建和销毁Chaco图表的示例,虽然晚了一点。主要接口是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(在应用程序内部调用)查看的。此外,请注意,此示例从 PlotController 调用 edit_traits 而不是从模型中调用它。您可以将视图从 PlotController 移动到 BasicPlot,并将该视图的处理程序方法设置为 PlotController
最后,如果您不需要完全销毁绘图窗口,则可能需要查看 Plot 对象的 delplot 方法,该方法会销毁*子*图(这里是线图或条形图)。
希望这有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接