Chacoで動的にプロットを作成します
質問
Python用のChacoプロットツールキットには、動的にする方法を示す例が含まれています アップデート 既存のプロット。ただし、私のアプリケーションではiが必要です プロットを動的に作成および破壊します データに応じて。私はチャコと特性を使用してプログラミングするのが初めてなので、これを行う方法を示す簡単な例は本当に役立ちます。
解決
これは少し遅れていますが、ここにチャコプロットを作成および破壊する例があります。メインインターフェイスはです PlotSelector
, 、いくつかの偽データと無線ボタンを定義して、2つの異なるプロットスタイル(ラインプロットとバープロット)を切り替えます。
この例では、特性イベントを使用して、プロットを閉じるタイミングを信号し、次にその信号を処理します PlotController
. 。窓を閉めるより良い方法があるかもしれませんが、私はそれを見つけることができませんでした。
編集: :特性、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
から PlotController
モデルから呼び出す代わりに。代わりに、ビューを移動できます PlotController
に BasicPlot
そのビューのハンドラー方法を設定します PlotController
.
最後に、プロットウィンドウを完全に破壊する必要がない場合は、 Plot
オブジェクト delplot
*を破壊する方法サブ*プロット(ここでは、ラインプロットまたはバープロット)。
それが役立つことを願っています。