我有一个默认有2个空LinePlots的HPlotContainer,它是使用create_line_plot()工厂函数创建的。然后,我执行一些计算,并希望更新绘图。如何访问LinePlot的ArrayPlotData?我尝试过像container.components[0].data这样的东西,我得到了一个
AttributeError:“”LinePlot“”对象没有属性“”data“”
显然,我在这里做的不是正确的事情。
发布于 2015-11-25 21:01:14
您正在操作的LinePlot对象实际上就是查科所说的“渲染器”,它不能访问数据。要动态更新绘图,需要调用ArrayPlotData对象上的set_data方法。您可以在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对象执行任何操作。
我得到的输出如下所示:

https://stackoverflow.com/questions/33898207
复制相似问题