2012-02-22 3 views
14

Python 용 Chaco 플로팅 툴킷에는 기존 플롯을 동적으로 업데이트하는 방법을 보여주는 예제가 포함되어 있습니다. 그러나 필자의 경우에는 은 데이터에 따라 플롯을 동적으로 만들고 파괴해야합니다. 나는 Chaco와 Traits으로 프로그래밍을 처음 사용하기 때문에이를 수행하는 방법을 보여주는 간단한 예제가 정말 도움이 될 것입니다.Chaco에서 동적으로 플롯 만들기

+0

음모가 필요하기 전에 음모 꾸미기 프레임을보고 싶지 않아도 음모를 꾸미는 시간이되면 음모 프레임을 제거하고 싶지 않습니까? –

+0

너무 많은 프레임을 보지 않아도됩니다. 데이터가 플롯 수를 제어하고 시간이 지남에 따라이 숫자가 바뀔 수 있으므로 미리 프레임을 만들 수 없습니다. 이 일을 어떻게 수행할지에 대한 생각은 있습니까? – Andreas

+1

죄송합니다. 지금 당장 좋은 답변을 드릴 시간이 없어요. 그러나이 페이지의 튜토리얼은 실제로 도움이되지 않습니까? http://github.enthought.com/chaco/user_manual/tutorial.html –

답변

7

조금 늦었지 만 여기에는 Chaco 플롯을 생성하고 소멸시키는 예제가 있습니다. 주 인터페이스는 PlotSelector으로, 두 가지 다른 플롯 스타일 (라인 및 바 플롯)간에 전환하기위한 가짜 데이터 및 라디오 버튼을 정의합니다.

이 예제에서는 특성 이벤트를 사용하여 플롯을 닫을 때를 알리고 PlotController으로 해당 신호를 처리합니다. 창을 닫는 더 좋은 방법이있을 수 있지만 찾을 수 없습니다.

편집 : Traits, Chaco 및 Enable (ETS 4 대신 3)의 새 버전에 대한 가져 오기가 업데이트되었습니다.

import numpy as np 

import traits.api as traits 
import traitsui.api as ui 
import chaco.api as chaco 
from enable.api import ComponentEditor 


class PlotController(ui.Controller): 
    view = ui.View(ui.Item('plot', editor=ComponentEditor(), show_label=False), 
        height=300, width=300, resizable=True) 

    def object_close_signal_changed(self, info): 
     info.ui.dispose() 


class BasicPlot(traits.HasTraits): 
    close_signal = traits.Event() 
    plot = traits.Instance(chaco.Plot) 


class LinePlot(BasicPlot): 

    def __init__(self, plotdata): 
     self.plot = chaco.Plot(plotdata) 
     self.plot.plot(('x', 'y')) 


class BarPlot(BasicPlot): 

    def __init__(self, plotdata): 
     self.plot = chaco.Plot(plotdata) 
     self.plot.candle_plot(('x', 'ymin', 'ymax')) 


available_plot_types = dict(line=LinePlot, bar=BarPlot) 

class PlotSelector(traits.HasTraits): 

    plot_type = traits.Enum(['line', 'bar']) 
    traits_view = ui.View('plot_type', style='custom') 

    def __init__(self, x, y): 
     ymin = y - 1 
     ymax = y + 1 
     self.plotdata = chaco.ArrayPlotData(x=x, y=y, ymin=ymin, ymax=ymax) 
     self.figure = None 

    def _plot_type_changed(self): 
     plot_class = available_plot_types[self.plot_type] 
     if self.figure is not None: 
      self.figure.close_signal = True 
     self.figure = plot_class(self.plotdata) 
     controller = PlotController(model=self.figure) 
     controller.edit_traits() 


N = 20 
x = np.arange(N) 
y = x + np.random.normal(size=N) 
plot_selector = PlotSelector(x, y) 
plot_selector.configure_traits() 

주 메인 인터페이스 (PlotSelector)이 플롯은 (응용 프로그램 내에서 호출) edit_traits으로 볼 동안 configure_traits은, (응용 프로그램을 시작) 호출하는. 또한이 예제에서는 모델에서 호출하는 대신 edit_traitsPlotController에서 호출합니다. 대신보기를 PlotController에서 BasicPlot으로 이동하고 해당보기의 처리기 메서드를 PlotController으로 설정할 수 있습니다. 당신이 완전히 플롯 창을 파괴 할 필요가없는 경우

마지막으로, 당신은 (여기에 선 그림 또는 막대 그래프)를 * 서브 * 플롯을 파괴 Plot 객체의 delplot 방법,보고 할 수 있습니다 .

도움이 되었기를 바랍니다.