用于Python的Chaco绘图工具包包含显示如何动态更新现有绘图的示例。但是,我的应用程序要求我根据数据动态创建和销毁图。我是Chaco和Traits编程的新手,所以一个简单的例子说明了如何做到这一点非常有帮助。
答案 0 :(得分: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
查看绘图(从应用程序内部调用)。另请注意,此示例从edit_traits
调用PlotController
,而不是从模型中调用它。您可以将视图从PlotController
移至BasicPlot
,并将该视图的处理程序方法设置为PlotController
。
最后,如果您不需要完全破坏绘图窗口,那么您可能需要查看Plot
对象的delplot
方法,该方法会破坏* sub *绘图(这里是线图或条形图)。
我希望有所帮助。