操作している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
ます。
次のような出力が得られます。
