2015-11-24 4 views
3

У меня есть HPlotContainer с 2 пустыми LinePlots в качестве значений по умолчанию, созданных с использованием фабричной функции create_line_plot(). Затем я выполняю некоторые вычисления и хочу обновить графики. Как получить доступ к ArrayPlotData для LinePlot? Я пытался что-то вроде container.components[0].data и я получилОбновление данных для компонента Chaco HPlotContainer

AttributeError: объект «LinePlot» имеет «данные» без атрибута

Очевидно, что я не делаю то, что нужно здесь.

ответ

0

Объект, которым вы управляете, на самом деле является тем, что Chaco называет «средством визуализации» и не имеет доступа к данным. Чтобы динамически обновлять графики, вы хотите вызвать метод set_data объекта ArrayPlotData. Вы можете получить доступ к этому объектам Plot, но в вашем случае имеет смысл хранить ссылку непосредственно на объект ArrayPlotData. Если вы хотите обновить объект LinePlot, тогда сделайте ссылку на него. Этот пример показывает стандартный способ делать такие вещи с TraitsUI и Чако:

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 объекта.

я получаю вывод, который выглядит следующим образом:

enter image description here

+0

Ну, 'Plot' класс имеет' data' атрибут, как вы продемонстрировать себя, но 'LinePlot', кажется, не имеют. Я использовал 'LinePlot', потому что мне было легче изменить его параметры внешнего вида, такие как ориентация осей и т. Д. – MindV0rtex

+0

Спасибо за разъяснение. Я обновил код и объяснил. –

 Смежные вопросы

  • Нет связанных вопросов^_^