我有一个HPlotContainer,默认为2个空LinePlots,使用create_line_plot()工厂函数创建。然后,我执行一些计算,并希望更新图表。如何访问LinePlot的ArrayPlotData?我尝试了类似{{1}}的东西,我得到了一个
AttributeError:' LinePlot'对象没有属性'数据'
显然我在这里没做正确的事。
答案 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
对象执行任何操作。
我得到的输出如下: