我有一个 HPlotContainer,默认有 2 个空 LinePlot,使用 create_line_plot() 工厂函数创建。然后我执行一些计算并想更新绘图。如何访问 LinePlot 的 ArrayPlotData?我试过类似的东西container.components[0].data
,我得到了
AttributeError:“LinePlot”对象没有属性“数据”
显然我在这里做的不对。
您正在操作的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
对象进行任何您想要的操作。
我得到如下所示的输出: