Matplotlib は、Python と NumPy のためのプロットライブラリです。Tkinter、wxPython、Qt、GTK のような汎用 GUI ツールキットを使ったアプリケーションにプロットを埋め込むためのオブジェクト指向 API を提供しています。
Wikipedia より引用、翻訳
PySide6 の GUI で Matplotlib のチャートを扱うときに利用する、ズームや保存などの便利な機能を提供するナビゲーション・ツールバー NavigationToolbar2QT について、ユーザー定義のボタンを追加する方法(+α)をまとめました。
下記の環境で動作確認をしています。
|
Fedora Linux 44 KDE Plasma Desktop x86_64 |
|
| Python | 3.14.5 | |
| matplotlib | 3.11.0 | |
| pyside6 | 6.11.1 | |
| seaborn | 0.13.2 | |
実行例
サンプルとして正規分布の乱数のヒストグラムを表示していますが、今回のテーマは、このチャートの下に表示されているナビゲーション・ツールバーのカスタマイズです。
ナビゲーション・ツールバーのカスタマイズ例として、「保存」ボタンの右側に「Qt」アイコン (SP_TitleBarMenuButton) を表示しています。
qt_matplotlib/toolbar.py の実行例
NavigationToolbar2QT を継承
NavigationToolbar2QT を継承して「Qt」アイコン (SP_TitleBarMenuButton)(ボタン)を追加しています。
from matplotlib.backends.backend_qtagg import (
NavigationToolbar2QT as NavigationToolbar,
)
class MyNavToolbar(NavigationToolbar):
def __init__(self, canvas: FigureCanvas):
super().__init__(canvas)
user_action = QAction("User", self)
icon = self.style().standardIcon(
QStyle.StandardPixmap.SP_TitleBarMenuButton
)
user_action.setIcon(icon)
user_action.triggered.connect(self.on_user_action)
actions = self.actions()
n = len(actions)
self.insertAction(actions[n - 1], user_action)
def on_user_action(self):
# Zoomモードなら解除
if self._actions["zoom"].isChecked():
self._actions["zoom"].trigger()
# Panモードなら解除
if self._actions["pan"].isChecked():
self._actions["pan"].trigger()
print("User button clicked")
「Qt」アイコン (SP_TitleBarMenuButton)(ボタン)をクリックすると、on_user_action メソッドが実行されて文字列が標準出力されますが、その他の機能として、ズームボタン self._actions["zoom"] あるいはパン(移動)ボタン self._actions["pan"] が選択状態であれば解除するようにしています。
サンプル・コード
サンプルコード qt_matplotlib_toolbar.py を示しました。
qt_matplotlib/toolbar.py
参考サイト
にほんブログ村
#オープンソース


