"""
概要: matplotlibを用いたプロット機能を提供するモジュール。
詳細説明:
tkObjectを継承し、matplotlibの機能をラップして、複数のサブプロットや動的なプロット更新を
容易にするユーティリティを提供します。2D/3Dプロット、等高線図などの描画に対応しています。
関連リンク: :doc:`tkplot_usage`
"""
import sys
import time
import argparse
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D
from matplotlib import cm
from tklib.tkobject import tkObject
[ドキュメント]
class tkPlot(tkObject):
"""
概要: matplotlibのプロット機能を提供するクラス。
詳細説明:
複数のサブプロットを管理し、2D/3Dプロット、等高線図などの描画機能を提供します。
tkObjectを継承しているため、tklibのフレームワーク内で利用可能です。
"""
def __init__(self, figsize = None, **kwargs):
"""
概要: tkPlotオブジェクトを初期化します。
詳細説明:
matplotlib.pyplot.figureを作成し、軸と線リストを初期化します。
figsizeはmatplotlib.pyplot.figureに渡されます。
kwargsはupdateメソッドに渡され、オブジェクトのプロパティを初期設定します。
tkObjectの初期化はinitializeメソッドで行われます。
:param figsize: (tuple, optional) 図のサイズ (幅, 高さ) をインチで指定します。デフォルトはNoneで、matplotlibのデフォルト設定が使用されます。
:param kwargs: (dict) tkObjectのupdateメソッドに渡される追加キーワード引数です。
"""
self.figure = plt.figure(figsize = figsize)
self.axes = []
self.lines = []
self.update(**kwargs)
[ドキュメント]
def initialize(self, **kwargs):
"""
概要: tkObjectとしてのオブジェクトを初期化します。
詳細説明:
親クラスtkObjectのinitializeメソッドを呼び出します。
:param kwargs: (dict) 親クラスのinitializeメソッドに渡されるキーワード引数です。
"""
super().__init__(**kwargs)
# def __del__(self):
# print("{} destroyed".format(self.name))
def __str__(self):
"""
概要: オブジェクトの文字列表現を返します。
詳細説明:
オブジェクトのmethod属性に基づいてフォーマットされた文字列を返します。
:returns: (str) オブジェクトの文字列表現。
"""
return "optimization object by {}".format(self.method)
[ドキュメント]
def pause(self, duration = 0.001, **kwargs):
"""
概要: 指定した時間だけプロットを一時停止し、GUIイベントを処理します。
詳細説明:
matplotlib.pyplot.pauseを呼び出し、プロットウィンドウを更新します。
アニメーションやインタラクティブな描画の際に使用されます。
:param duration: (float) 一時停止する時間(秒)です。デフォルトは0.001秒です。
:param kwargs: (dict) matplotlib.pyplot.pauseに渡される追加キーワード引数です。
"""
plt.pause(duration, **kwargs)
[ドキュメント]
def show(self, **kwargs):
"""
概要: すべての開いているプロットウィンドウを表示します。
詳細説明:
matplotlib.pyplot.showを呼び出し、ブロックモードでプロットを表示します。
このメソッドが呼び出されると、通常はプロットウィンドウが閉じられるまでプログラムの実行がブロックされます。
:param kwargs: (dict) matplotlib.pyplot.showに渡される追加キーワード引数です。
"""
plt.show(**kwargs)
[ドキュメント]
def sleep(self, duration):
"""
概要: 指定した時間だけプログラムの実行を停止します。
詳細説明:
time.sleepを呼び出し、スレッドの実行を一時停止します。
これはプロットの更新とは直接関係なく、一般的な時間遅延のために使用されます。
:param duration: (float) 停止する時間(秒)です。
"""
time.sleep(duration)
[ドキュメント]
def adjust_list(self, n):
"""
概要: サブプロットのリストself.axesのサイズを調整します。
詳細説明:
指定されたインデックスnまでself.axesリストが拡張され、必要に応じてNoneが追加されます。
これにより、存在しないインデックスにアクセスしようとしたときにエラーが発生するのを防ぎます。
:param n: (int) リストを調整する目標の最大インデックスです。
"""
for i in range(len(self.axes), n+1):
self.axes.append(None)
[ドキュメント]
def add_subplot(self, nrows = 1, ncols = 1, index = 0, **kwargs):
"""
概要: matplotlib.figureに新しいサブプロットを追加します。
詳細説明:
matplotlib.pyplot.subplotの機能を継承していますが、インデックスのカウント方法が0から始まります。
新しいサブプロットオブジェクトを作成し、self.axesリストに追加して返します。
各サブプロットには、linelist, xlist, ylist, zlistというカスタム属性が初期化されます。
:param nrows: (int, optional) グリッドの行数です。デフォルトは1です。
:param ncols: (int, optional) グリッドの列数です。デフォルトは1です。
:param index: (int, optional) サブプロットのインデックス(0からカウント)。元のmatplotlibの定義とは異なり、0から始まります。デフォルトは0です。
:param kwargs: (dict) matplotlib.figure.add_subplotに渡される追加キーワード引数です。
:returns: (matplotlib.axes.Axes) 追加されたサブプロットオブジェクト。
"""
ax = self.figure.add_subplot(nrows, ncols, index+1, **kwargs)
try:
ax.linelist
except:
ax.linelist = []
ax.xlist = []
ax.ylist = []
ax.zlist = []
self.adjust_list(index)
self.axes[index] = ax
return ax
[ドキュメント]
def plot(self, iaxes = 0, xd = None, yd = None,
color = 'blue', linestyle = '', linewidth = 0.5,
fillstyle = 'full', marker = '', markersize = 5,
**kwargs):
"""
概要: 指定されたサブプロットに2次元データをプロットします。
詳細説明:
matplotlib.axes.Axes.plotを呼び出し、データとスタイルに基づいて線グラフを描画します。
描画された線オブジェクトとデータは、サブプロットのlinelist, xlist, ylistに格納されます。
:param iaxes: (int, optional) プロット対象のサブプロットのインデックスです。デフォルトは0です。
:param xd: (array-like, optional) X軸のデータです。
:param yd: (array-like, optional) Y軸のデータです。
:param color: (str, optional) 線の色です。デフォルトは'blue'です。
:param linestyle: (str, optional) 線のスタイルです。デフォルトは'' (実線)です。
:param linewidth: (float, optional) 線の幅です。デフォルトは0.5です。
:param fillstyle: (str, optional) マーカーの塗りつぶしスタイルです。デフォルトは'full'です。
:param marker: (str, optional) マーカーのスタイルです。デフォルトは'' (マーカーなし)です。
:param markersize: (float, optional) マーカーのサイズです。デフォルトは5です。
:param kwargs: (dict) matplotlib.axes.Axes.plotに渡される追加キーワード引数です。
:returns: (list) 描画されたLine2Dオブジェクトのリスト。
"""
lines = self.axes[iaxes].plot(xd, yd,
color = color, linestyle = linestyle, linewidth = linewidth,
fillstyle = fillstyle, marker = marker, markersize = markersize,
**kwargs)
self.axes[iaxes].linelist.append(lines)
self.axes[iaxes].xlist.append(xd)
self.axes[iaxes].ylist.append(yd)
self.axes[iaxes].zlist.append([])
return lines
[ドキュメント]
def plot_wireframe(self, iaxes = 0, xd = None, yd = None, zd = None,
rstride = 2, cstride = 2):
"""
概要: 指定されたサブプロットに3次元のワイヤーフレーム表面をプロットします。
詳細説明:
matplotlib.axes.Axes.plot_wireframeを呼び出し、3次元データをワイヤーフレームとして描画します。
描画された表面オブジェクトとデータは、サブプロットのlinelist, xlist, ylist, zlistに格納されます。
:param iaxes: (int, optional) プロット対象のサブプロットのインデックスです。デフォルトは0です。
:param xd: (array-like, optional) X座標のグリッドデータです。
:param yd: (array-like, optional) Y座標のグリッドデータです。
:param zd: (array-like, optional) Z座標のグリッドデータです。
:param rstride: (int, optional) 行方向のストライド(ステップサイズ)です。デフォルトは2です。
:param cstride: (int, optional) 列方向のストライド(ステップサイズ)です。デフォルトは2です。
:returns: (mpl_toolkits.mplot3d.art3d.Line3DCollection) 描画されたワイヤーフレームオブジェクト。
"""
surface = self.axes[iaxes].plot_wireframe(xd, yd, zd, rstride = rstride, cstride = cstride)
self.axes[iaxes].linelist.append(surface)
self.axes[iaxes].xlist.append(xd)
self.axes[iaxes].ylist.append(yd)
self.axes[iaxes].zlist.append(zd)
return surface
[ドキュメント]
def plot_contour(self, iaxes = 0, xd = None, yd = None, zd = None,
levels = 51, cmap = 'Spectral', **kwargs):
"""
概要: 指定されたサブプロットに2次元の等高線図または塗りつぶし等高線図をプロットします。
詳細説明:
matplotlib.axes.Axes.contourまたはmatplotlib.axes.Axes.contourfを呼び出して等高線図を描画します。
cmapが'line'の場合は線等高線図(contour)を、それ以外の場合は塗りつぶし等高線図(contourf)を描画します。
kwargsに'aspect'が含まれている場合、アスペクト比を設定します。
描画された等高線オブジェクトとデータは、サブプロットのlinelist, xlist, ylist, zlistに格納されます。
:param iaxes: (int, optional) プロット対象のサブプロットのインデックスです。デフォルトは0です。
:param xd: (array-like, optional) X座標のグリッドデータです。
:param yd: (array-like, optional) Y座標のグリッドデータです。
:param zd: (array-like, optional) Z座標のグリッドデータです。
:param levels: (int or array-like, optional) 描画する等高線の数、または特定の等高線レベルのリストです。デフォルトは51です。
:param cmap: (str or matplotlib.colors.Colormap, optional) 等高線図の色マップです。'line'を指定すると線等高線図になります。デフォルトは'Spectral'です。
:param kwargs: (dict) matplotlib.axes.Axes.contourまたはcontourfに渡される追加キーワード引数です。また、'aspect'キーでアスペクト比を設定できます。
:returns: (matplotlib.contour.ContourSet) 描画された等高線オブジェクト。
"""
if cmap == 'line':
contour = self.axes[iaxes].contour(xd, yd, zd, levels = levels, **kwargs)
else:
contour = self.axes[iaxes].contourf(xd, yd, zd, levels = levels, cmap = cmap, **kwargs)
if kwargs['aspect'] is not None:
self.axes[iaxes].set_aspect(kwargs['aspect'])
self.axes[iaxes].linelist.append(contour)
self.axes[iaxes].xlist.append(xd)
self.axes[iaxes].ylist.append(yd)
self.axes[iaxes].zlist.append(zd)
return contour
[ドキュメント]
def set_data(self, iaxes, ilines, idx, xt, yt):
"""
概要: 既存のプロット線のデータを更新します。
詳細説明:
指定されたサブプロット、線、インデックスのLine2Dオブジェクトのデータを更新します。
主に動的なプロット更新(アニメーションなど)に使用されます。
:param iaxes: (int) データが更新されるサブプロットのインデックスです。
:param ilines: (int) データが更新される線のリスト内のインデックスです。
:param idx: (int) 更新される線の、linelist[ilines] 内のインデックスです。通常は0です。
:param xt: (array-like) 新しいX軸データです。
:param yt: (array-like) 新しいY軸データです。
"""
self.axes[iaxes].linelist[ilines][idx].set_data(xt, yt)
[ドキュメント]
def set_axtitle(self, iaxes, title):
"""
概要: 指定されたサブプロットのタイトルを設定します。
詳細説明:
matplotlib.axes.Axes.set_titleを呼び出して、サブプロットのタイトルを設定します。
:param iaxes: (int) タイトルが設定されるサブプロットのインデックスです。
:param title: (str) サブプロットに設定するタイトル文字列です。
"""
self.axes[iaxes].set_title(title)