15

Python 用の Chaco プロット ツールキットには、既存のプロットを動的に更新する方法を示す例が含まれています。ただし、私のアプリケーションでは、データに応じてプロットを動的に作成および破棄する必要があります。Chaco と Traits を使用したプログラミングは初めてなので、これを行う方法を示す簡単な例が非常に役立ちます。

4

1 に答える 1

8

これは少し遅れていますが、Chaco プロットを作成および破棄する例を次に示します。メイン インターフェイスはPlotSelectorで、2 つの異なるプロット スタイル (折れ線グラフと棒グラフ) を切り替えるためのいくつかの偽のデータとラジオ ボタンを定義します。

この例では、Traits イベントを使用してプロットを閉じるタイミングを通知し、その信号を で処理しPlotControllerます。ウィンドウを閉じるにはもっと良い方法があるかもしれませんが、見つけられませんでした。

編集: 新しいバージョンの Traits、Chaco、および Enable (3 ではなく ETS 4) のインポートを更新しました。

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) が呼び出されるconfigure_traits(アプリケーションを開始する) のに対し、プロットはedit_traits(アプリケーション内から呼び出される) で表示されることに注意してください。edit_traitsまた、この例では、モデルから呼び出すのではなく、から呼び出していることに注意してくださいPlotControllerPlotController代わりに、ビューを からに移動し、そのビューBasicPlotのハンドラ メソッドを に設定することもできますPlotController

最後に、プロット ウィンドウを完全に破棄する必要がない場合は、サブ* プロット (ここでは折れ線グラフまたは棒グラフ)を破棄するPlotオブジェクトの delplotメソッドを確認することをお勧めします。

それが役立つことを願っています。

于 2012-06-16T21:08:22.843 に答える