PySide (Qt for Python) は、Qt(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは LGPL で公開されています。
mplfinance のチャートを PySide6 のウィジェットに埋め込んだ時に、表示するチャートを動的に増やしたり減らしたりしたかったので、FigureCanvas インスタンスを変えずに、表示するチャートの数を増減するサンプルを作ってみました。
下記の OS 環境で動作確認をしています。
|
RHEL 9.4 | x86_64 |
| Python | 3.12.1 | |
| PySide6 | 6.7.2 | |
| mplfinance | 0.12.10b0 | |
| yfinance | 0.2.41 |
サンプルを以下に示しました。サンプルでは、日経平均株価の過去3ヶ月の日足データを yfinance で取得しています。
qt_mpl_finance_3.py
qt_mpl_finance_3.py の実行例
ツールバーの Volume チャックボックスにチェックを入れると、出来高の棒グラフが下に追加されます。プロットは切り替える度に再描画しています。
qt_mpl_finance_3.py の実行例(ツールバーの Volume チャックボックスをチェック)
FigureCanvas クラスを継承した MyChart クラスで、軸数の設定や再描画の処理をしています。今回の用途では縦方向にチャートを増減させるだけですが、メインのチャートを常に大きく表示したかったので、処理を簡単にするために GridSpec で複数チャートの表示レイアウトを決めています。
class MyChart(FigureCanvas):
def __init__(self):
self.fig = Figure()
super().__init__(self.fig)
self.fig.subplots_adjust(
left=0.12,
right=0.87,
top=0.9,
bottom=0.05,
)
self.ax = dict()
def initAxes(self, ax, n: int):
if n > 1:
gs = self.fig.add_gridspec(
n, 1,
wspace=0.0, hspace=0.0,
height_ratios=[3 if i == 0 else 1 for i in range(n)]
)
for i, axis in enumerate(gs.subplots(sharex='col')):
ax[i] = axis
ax[i].grid()
else:
ax[0] = self.fig.add_subplot()
ax[0].grid()
def initChart(self, n: int):
self.removeAxes()
self.initAxes(self.ax, n)
def clearAxes(self):
axs = self.fig.axes
for ax in axs:
ax.cla()
def refreshDraw(self):
self.fig.canvas.draw()
def removeAxes(self):
axs = self.fig.axes
for ax in axs:
ax.remove()
self.ax = dict()
def setTitle(self, title: str):
self.ax[0].set_title(title)
MyChart の使い方は(mplfinance には依存せず)以下のような流れになります。
# MyChart クラスのインスタンスを配置 chart = MyChart() self.setCentralWidget(chart) # チャート用のナビゲーションツールバーを配置 navigation = NavigationToolbar(chart) self.addToolBar(navigation) ... ... # 表示するチャート数を n で指定して初期化 chart.initChart(n) # チャートを描画 # 軸は chart.ax[0], chart.ax[1], ..., chart.ax[n-1] で指定 ... ... # チャートの表示を更新 chart.refreshDraw() # ナビゲーションツールバーの更新 navigation.update()
参考サイト
にほんブログ村
#オープンソース





0 件のコメント:
コメントを投稿