2023-12-06

PyGObject/GTK4 と Matplotlib (2)

GObject (GLib Object System) は、GTK+ のすべてのウィジェットおよび関連するオブジェクトの基底クラスからなるオブジェクトシステムと、言語間の透過的相互運用性を提供するライブラリです。GObject は C 言語で実装されており、バインディングによって他の言語から利用可能となっています。

PyGObject は GObject へのバインディングを提供する Python パッケージです。

Wikipedia より引用・編集

NaviationToolbar の追加

ブログ記事 [1] では、Matplotlib で描画したプロットを PyGObject/GTK4 のウィジェットに埋め込んだサンプルを紹介しましたが、ナビゲーション用のツールバーを付けていませんでした。

参考サイト [2] に紹介されているサンプルを参考にして、ツールバーを追加しました。

本記事では、下記の OS 環境を使用しています。

Fedora Workstation 39 x86_64
Python 3.12.0
PyGObject 3.46.0
matplotlib 3.8.2

下記に NavigationToolbar を追加したサンプルを示しました。

gtk_matplotlib_navtoolbar.py
#!/usr/bin/env python
# coding: utf-8
# Reference:
# https://matplotlib.org/stable/gallery/user_interfaces/embedding_in_gtk4_panzoom_sgskip.html
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk
from matplotlib.backends.backend_gtk4 import (
NavigationToolbar2GTK4 as NavigationToolbar,
)
from matplotlib.backends.backend_gtk4agg import (
FigureCanvasGTK4Agg as FigureCanvas,
)
from matplotlib.figure import Figure
import pandas as pd
APPID = 'com.blogspot.bitwalk'
def get_example_chart() -> Figure:
# example dataframe
df = pd.DataFrame({
'Sample': list(range(1, 11)),
'Y': [9.030, 8.810, 9.402, 8.664, 8.773, 8.774, 8.416, 9.101, 8.687, 8.767]
})
fig = Figure(dpi=100)
ax = fig.add_subplot(
title='Plot sample',
xlabel='Sample',
ylabel='Value',
)
ax.plot(
df['Sample'],
df['Y'],
color='red',
marker='o',
markersize=5,
)
ax.grid(True)
return fig
class Example(Gtk.Window):
def __init__(self, app):
Gtk.Window.__init__(
self,
application=app,
title='Matplotlib',
default_width=600,
default_height=500,
)
vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.set_child(vbox)
swin = Gtk.ScrolledWindow()
vbox.append(swin)
figure = get_example_chart()
canvas = FigureCanvas(figure)
canvas.set_size_request(500, 300) # set minimum size
swin.set_child(canvas)
toolbar = NavigationToolbar(canvas)
vbox.append(toolbar)
class MyApplication(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self, application_id=APPID)
def do_activate(self):
win = Example(self)
win.present()
def main():
app = MyApplication()
app.run()
if __name__ == '__main__':
main()

下記のようにして上記サンプルを実行します。

(venv) $ python gtk_matplotlib_navtoolbar.py
gtk_matplotlib_navtoolbar.py の実行例

いつも NaviationToolbar が必要ではないかもしれないのですが、付けたいときのためにサンプルを追加しました。

参考サイト

  1. bitWalk's: PyGObject/GTK4 と Matplotlib [2023-12-05]
  2. Embedding in GTK4 with a navigation toolbar — Matplotlib documentation

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



0 件のコメント: