更新Chaco HPlotContainer组件的数据

时间:2015-11-24 15:55:10

标签: enthought chaco

我有一个HPlotContainer,默认为2个空LinePlots,使用create_line_plot()工厂函数创建。然后,我执行一些计算,并希望更新图表。如何访问LinePlot的ArrayPlotData?我尝试了类似{{1}}的东西,我得到了一个

AttributeError:' LinePlot'对象没有属性'数据'

显然我在这里没做正确的事。

1 个答案:

答案 0 :(得分:0)

您正在操纵的LinePlot对象实际上是Chaco所称的"渲染器"并且无法访问数据。要动态更新绘图,您需要在set_data对象上调用ArrayPlotData方法。您可以在Plot对象上访问它,但在您的情况下,最好将引用直接保存到ArrayPlotData对象。如果要更新LinePlot对象,请引用它。这个例子展示了使用TraitsUI和Chaco做这种事情的标准方法:

from chaco.api import ArrayPlotData, HPlotContainer, Plot, LinePlot
from enable.api import ComponentEditor
import numpy as np
from traits.api import Array, Event, HasTraits, Instance, Int
from traitsui.api import ButtonEditor, Item, View


class DataUpdateDemo(HasTraits):
    plots = Instance(HPlotContainer)
    plot_data = Instance(ArrayPlotData)
    line_plot_1 = Instance(LinePlot)
    line_plot_2 = Instance(LinePlot)
    x = Array
    y = Array
    go = Event
    w = Int(1)

    def _x_default(self):
        x = np.linspace(-np.pi, np.pi, 100)
        return x

    def _y_default(self):
        y = np.sin(self.w * self.x)
        return y

    def _plots_default(self):
        self.plot_data = ArrayPlotData(y=self.y, x=self.x)
        plot1 = Plot(self.plot_data)
        self.line_plot_renderer1 = plot1.plot(('x', 'y'), kind='line')[0]
        plot2 = Plot(self.plot_data)
        self.line_plot_renderer_2 = plot2.plot(('y', 'x'), kind='line')[0]
        plots = HPlotContainer(plot1, plot2)
        return plots

    def _go_fired(self):
        self.w += 1
        y = np.sin(self.w * self.x)
        self.plot_data.set_data("y", y)

    traits_view = View(
        Item('plots', editor=ComponentEditor(), show_label=False),
        Item('go', editor=ButtonEditor(label="update"), show_label=False),
    )


if __name__ == "__main__":
    dud = DataUpdateDemo()
    dud.configure_traits()

现在,您可以对LinePlot对象执行任何操作。

我得到的输出如下:

enter image description here