我有一个使用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组件的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33898207/