Обновление данных для компонента 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 объект.

Я получаю вывод, который выглядит так:

Другие вопросы по тегам