我有一个使用2个空LinePlot作为默认值的HPlotContainer,它是使用create_line_plot()工厂函数创建的。然后,我执行一些计算,并想更新绘图。如何访问LinePlot的ArrayPlotData?我尝试过类似container.components[0].data的操作,

AttributeError:“ LinePlot”对象没有属性“ data”

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

最佳答案

您正在操作的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对象执行任何所需的操作。

我得到的输出看起来像这样:

enthought - 更新Chaco HPlotContainer组件的数据-LMLPHP

关于enthought - 更新Chaco HPlotContainer组件的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33898207/

10-10 18:21