tkplot.py ライブラリ技術ドキュメント

ライブラリの機能や目的

tkplot.py ライブラリは、Pythonの著名なグラフ描画ライブラリである matplotlib の機能を抽象化し、より扱いやすくすることを目的としています。特に、複数のサブプロットの管理、プロットデータの動的な更新、および基本的なグラフ描画操作を簡素化します。

このライブラリの主な機能は以下の通りです。

  • matplotlib.figure.Figure オブジェクトの生成と管理。

  • 複数のサブプロット(matplotlib.axes.Axes オブジェクト)の追加、初期化、および管理。

  • 2次元ラインプロット、3次元ワイヤーフレームプロット、2次元等高線/塗りつぶし等高線プロットといった多様なグラフ描画機能。

  • 既存のプロットデータの動的な更新機能。

  • グラフ表示の一時停止、表示、指定時間待機などの制御機能。

tkplot.py は、matplotlib を直接操作する際に発生する冗長なコード記述を削減し、特にGUIアプリケーションなどでの動的なデータ表示や、複数のグラフを効率的に管理する必要がある場面で、開発者の負担を軽減することを課題解決の目標としています。

importする方法

tkplot.py ライブラリは、Pythonプログラム内で以下のようにインポートできます。

tkPlot クラスを直接インポートする場合:

from tkplot import tkPlot

ライブラリ全体をインポートしてクラスを修飾子付きで利用する場合:

import tkplot
plotter = tkplot.tkPlot()

必要な非標準ライブラリとインストール方法

tkplot.py は、以下の非標準ライブラリに依存しています。これらのライブラリは、pip コマンドを使用してインストールできます。

  • matplotlib:

    • 目的: グラフ描画機能の基盤を提供します。特に3Dプロットのためには mpl_toolkits.mplot3d モジュールも利用します。

    • インストール方法:

      pip install matplotlib
      
  • tklib:

    • 目的: tkPlot クラスは tklib.tkobject.tkObject を継承しており、その基本機能に依存します。

    • インストール方法: tklib は一般的なPythonパッケージリポジトリに存在しない可能性がありますが、もし存在する場合は以下のコマンドでインストールできます。

      pip install tklib
      

      上記でインストールできない場合は、tklib の提供元から直接入手するか、そのドキュメントを参照してインストールする必要があります。

importできる変数と関数

tkplot.py ライブラリからインポートできる主要な要素は tkPlot クラスです。

クラス: tkPlot

tkPlot クラスは、matplotlib の描画機能をカプセル化し、よりオブジェクト指向的に扱えるようにするクラスです。tklib.tkobject.tkObject を継承しています。

属性

tkPlot オブジェクトは以下の重要な属性を持ちます。

  • figure (matplotlib.figure.Figure): このオブジェクトが管理する matplotlib のFigureオブジェクトです。すべてのサブプロットはこのFigure上に配置されます。

  • axes (list of matplotlib.axes.Axes or None): 追加されたサブプロット(Axesオブジェクト)のリストです。各サブプロットはインデックス iaxes でアクセスされ、複数のサブプロットを管理するために使用されます。

  • lines (list): 各Axesに追加された描画ラインオブジェクトのリストです。ただし、現在の実装では主に各Axesオブジェクトの linelist 属性が使われているため、tkPlot オブジェクトの lines 属性は直接使用されていません。

メソッド

  • __init__(self, figsize = None, **kwargs)

    • 動作: tkPlot オブジェクトを初期化します。新しい matplotlib.figure.Figure オブジェクトを作成し、axes および lines の内部リストを初期化します。親クラスである tkObject の初期化も行われます。

    • 引数:

      • figsize (tuple, optional): Figureの幅と高さを示すタプル (width, height)(インチ単位)。matplotlib.pyplot.figure に渡されます。デフォルトは None で、matplotlib のデフォルトサイズを使用します。

      • **kwargs: 親クラス tkObject の初期化メソッドに渡される追加のキーワード引数。

    • 戻り値: なし

  • initialize(self, **kwargs)

    • 動作: 親クラス tkObjectinitialize メソッドを呼び出します。

    • 引数:

      • **kwargs: tkObject.initialize に渡されるキーワード引数。

    • 戻り値: なし

  • __str__(self)

    • 動作: オブジェクトの文字列表現を返します。オブジェクトの method 属性が設定されている場合、「optimization object by [method]」という形式の文字列を返します。

    • 引数: なし

    • 戻り値: (str) オブジェクトの文字列表現。

  • pause(self, duration = 0.001, **kwargs)

    • 動作: matplotlib.pyplot.pause を呼び出し、指定された時間だけプロットを一時停止し、GUIイベントを処理します。これは、動的なプロット更新時にフレームを描画し、GUIがフリーズするのを防ぐために非常に重要です。

    • 引数:

      • duration (float, optional): 一時停止する秒数。デフォルトは \(0.001\) 秒。

      • **kwargs: plt.pause に渡される追加のキーワード引数。

    • 戻り値: なし

  • show(self, **kwargs)

    • 動作: matplotlib.pyplot.show を呼び出し、現在のアクティブなFigureを表示します。このメソッドは通常、プログラムの最後に一度だけ呼び出され、すべてのウィンドウを開いたままにします。

    • 引数:

      • **kwargs: plt.show に渡される追加のキーワード引数。

    • 戻り値: なし

  • sleep(self, duration)

    • 動作: time.sleep を呼び出し、指定された時間だけプログラムの実行を中断します。

    • 引数:

      • duration (float): スリープする秒数。

    • 戻り値: なし

  • adjust_list(self, n)

    • 動作: self.axes リストのサイズが少なくとも n+1 になるように調整します。もし現在のリストの長さが n+1 より小さい場合、差分の要素を None で埋めます。これは、指定されたインデックス n のサブプロットを確実に格納できるようにするために使用されます。

    • 引数:

      • n (int): self.axes リストに格納したいサブプロットの最大インデックス。

    • 戻り値: なし

  • add_subplot(self, nrows = 1, ncols = 1, index = 0, **kwargs)

    • 動作: matplotlib.figure.Figure.add_subplot を呼び出して新しいサブプロット(Axesオブジェクト)をFigureに追加します。このメソッドは、matplotlib.pyplot.subplot の動作を継承していますが、index パラメータは \(0\) からカウントされる点が異なります(matplotlib のオリジナルは \(1\) から始まります)。追加されたAxesオブジェクトには、後続のプロットデータを管理するための linelist, xlist, ylist, zlist というカスタム属性が初期化されます。

    • 引数:

      • nrows (int, optional): グリッドの行数。デフォルトは \(1\)

      • ncols (int, optional): グリッドの列数。デフォルトは \(1\)

      • index (int, optional): グリッド内のサブプロットのインデックス(\(0\) から開始)。例えば、\(0\) は最初のサブプロット、 \(1\) は2番目のサブプロットです。デフォルトは \(0\)

      • **kwargs: Figure.add_subplot に渡される追加のキーワード引数。

    • 戻り値: (matplotlib.axes.Axes) 追加されたAxesオブジェクト。

  • plot(self, iaxes = 0, xd = None, yd = None, color = 'blue', linestyle = '', linewidth = 0.5, fillstyle = 'full', marker = '', markersize = 5, **kwargs)

    • 動作: 指定されたAxesオブジェクトに2次元のラインプロットを描画します。描画されたラインオブジェクトは、対応するAxesの linelist に追加され、データ (xd, yd, 空のzlist) も保存されます。

    • 引数:

      • iaxes (int, optional): プロットを描画するAxesのインデックス。デフォルトは \(0\)

      • xd (array-like, optional): X軸のデータ。matplotlib.axes.Axes.plot に渡されます。デフォルトは None

      • yd (array-like, optional): Y軸のデータ。matplotlib.axes.Axes.plot に渡されます。デフォルトは None

      • color (str, optional): ラインの色。デフォルトは 'blue'

      • linestyle (str, optional): ラインのスタイル。デフォルトは ''(実線)。

      • linewidth (float, optional): ラインの幅。デフォルトは \(0.5\)

      • fillstyle (str, optional): マーカーの塗りつぶしスタイル。デフォルトは 'full'

      • marker (str, optional): マーカーのスタイル。デフォルトは ''(マーカーなし)。

      • markersize (float, optional): マーカーのサイズ。デフォルトは \(5\)

      • **kwargs: Axes.plot に渡される追加のキーワード引数。

    • 戻り値: (list of matplotlib.lines.Line2D) 描画されたラインオブジェクトのリスト。

  • plot_wireframe(self, iaxes = 0, xd = None, yd = None, zd = None, rstride = 2, cstride = 2)

    • 動作: 指定されたAxesオブジェクトに3次元のワイヤーフレームプロットを描画します。描画されたSurfaceオブジェクトは、対応するAxesの linelist に追加され、データ (xd, yd, zd) も保存されます。この機能を利用するには、Axesが3Dプロット用に初期化されている必要があります(例: add_subplot(projection='3d'))。

    • 引数:

      • iaxes (int, optional): プロットを描画するAxesのインデックス。デフォルトは \(0\)

      • xd (array-like, optional): X軸のデータ。デフォルトは None

      • yd (array-like, optional): Y軸のデータ。デフォルトは None

      • zd (array-like, optional): Z軸のデータ。デフォルトは None

      • rstride (int, optional): 行方向のストライド(サンプリング間隔)。デフォルトは \(2\)

      • cstride (int, optional): 列方向のストライド(サンプリング間隔)。デフォルトは \(2\)

    • 戻り値: (matplotlib.collections.PolyCollection) 描画されたワイヤーフレームオブジェクト。

  • plot_contour(self, iaxes = 0, xd = None, yd = None, zd = None, levels = 51, cmap = 'Spectral', **kwargs)

    • 動作: 指定されたAxesオブジェクトに2次元の等高線プロット(contour または contourf)を描画します。cmap'line' の場合は等高線 (contour) を使用し、それ以外の場合は塗りつぶし等高線 (contourf) と指定されたカラーマップを使用します。描画されたContourオブジェクトは、対応するAxesの linelist に追加され、データ (xd, yd, zd) も保存されます。

    • 引数:

      • iaxes (int, optional): プロットを描画するAxesのインデックス。デフォルトは \(0\)

      • xd (array-like, optional): X軸のデータ。デフォルトは None

      • yd (array-like, optional): Y軸のデータ。デフォルトは None

      • zd (array-like, optional): Z軸のデータ。デフォルトは None

      • levels (int or array-like, optional): 等高線の数、または特定の等高線レベルのリスト。デフォルトは \(51\)

      • cmap (str, optional): カラーマップの名前。'line' の場合、contour を使用。それ以外の場合、contourf と指定されたカラーマップを使用。デフォルトは 'Spectral'

      • **kwargs: Axes.contour または Axes.contourf に渡される追加のキーワード引数。特に aspect キーワードが渡された場合、Axesのアスペクト比が設定されます。

    • 戻り値: (matplotlib.contour.ContourSet) 描画された等高線オブジェクト。

  • set_data(self, iaxes, ilines, idx, xt, yt)

    • 動作: 指定されたAxes上の既存のラインプロットのデータを更新します。これは、動的なプロット(アニメーションなど)を行う際に、新しいデータを効率的に反映するために使用されます。

    • 引数:

      • iaxes (int): 更新するラインプロットを含むAxesのインデックス。

      • ilines (int): Axesの linelist 内で更新するラインセットのインデックス。

      • idx (int): linelist[ilines] がリストの場合、その中の具体的なラインオブジェクトのインデックス(通常は \(0\))。

      • xt (array-like): 新しいX軸のデータ。

      • yt (array-like): 新しいY軸のデータ。

    • 戻り値: なし

  • set_axtitle(self, iaxes, title)

    • 動作: 指定されたAxesオブジェクトのタイトルを設定します。

    • 引数:

      • iaxes (int): タイトルを設定するAxesのインデックス。

      • title (str): 設定するタイトル文字列。

    • 戻り値: なし

main scriptとして実行したときの動作

tkplot.py はライブラリとして設計されており、Pythonの慣例である if __name__ == '__main__': ブロックを含んでいません。したがって、このファイルをPythonインタープリタで直接実行しても、特別な処理は行われません。通常、このライブラリは他のPythonスクリプトやアプリケーションからインポートされ、その機能が利用されることを想定しています。