2015-11-24 63 views
3

我有一個HPlotContainer,它有兩個空的LinePlot作爲默認值,使用create_line_plot()工廠函數創建。然後我執行一些計算並想更新這些圖。如何訪問LinePlot的ArrayPlotData?我曾嘗試類似container.components[0].data,我得到了一個更新Chaco組件的數據HPlotContainer

AttributeError的:「LinePlot」對象有沒有屬性「數據」

顯然我沒有做正確的事情在這裏。

回答

0

您操縱的LinePlot對象實際上是Chaco所稱的「渲染器」,並且無法訪問數據。要動態更新圖,您需要調用ArrayPlotData對象上的set_data方法。您可以訪問Plot對象上的對象,但在您的情況下,最好直接保留對象的引用。如果您想更新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

感謝您的澄清。我更新了代碼和解釋。 –