Обновление данных для компонента Chaco HPlotContainer
У меня есть HPlotContainer с 2 пустыми LinePlots в качестве значений по умолчанию, созданных с использованием фабричной функции create_line_plot(). Затем я выполняю некоторые расчеты и хотел бы обновить графики. Как я могу получить доступ к ArrayPlotData LinePlot? Я пробовал что-то вроде container.components[0].data
и я получил
AttributeError: у объекта 'LinePlot' нет атрибута 'data'
Я явно не правильно делаю здесь.
1 ответ
LinePlot
Объект, которым вы манипулируете, это то, что Чако называет "рендерером" и не имеет доступа к данным. Для динамического обновления графиков необходимо вызвать 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
объект.
Я получаю вывод, который выглядит так: