見本コードを研究する

Matplotlib を手足のように使いこなせるようになるには、相当時間を要すると前書きで述べた。ここでは、習うより慣れろの精神で Matplotlib ドキュメント内の 見本コード集 からいろいろと吸収することを考えてみよう。

コードを収集する

公式サイトに付属している見本集の本数は 400 を軽く超える。これらをブラウザーで閲覧しながら、一個一個の見本コードのページを見ていくのは効率が悪い。研究に本腰を入れるのならば、これら全てをあらかじめローカルにダウンロードしておくべきだろう。その方法としては次のどちらかを挙げたい。

  • 素直に Matplotlib のリポジトリーを git clone してから、examples ディレクトリーにあるコードにアクセスする。

  • とにかく見本コードだけが手許にあれば十分なので、examples ディレクトリーしかダウンロードせずに済ませる。

PC のディスク残量とインターネットの接続環境に不満がないか、あるいは既に GitHub にあるリポジトリーのクローンを pip install -e していて、そのソースコードをそのまま利用中であるならば、前者の方法で問題はない。

bash$ git clone https://github.com/matplotlib/matplotlib.git
bash$ cd matplotlib/examples

そうではなく、資源が乏しかったり、もうパッケージがあるのにクローンなど作成したくないのであれば、必要な分だけをダウンロードするだけで済ませる。

Git リポジトリーの特定のディレクトリーのスナップショットを得るのに古の VCS ツールである svn が利用できる。

bash$ svn export https://github.com/matplotlib/matplotlib.git/trunk/examples
bash$ mv examples mpl-examples
bash$ cd mpl-examples

コードを実行する

コマンドプロンプトから実行するか、または IPython のコマンド %run を使うことで見本スクリプトの挙動を確認することができる。後者の方法のほうがわずかに効率が良い?

後述する、開発陣が利用しているであろう tests/backend_driver.py も有用である。

稼働ノート

本節では評者が examples にある見本コードを実際に実行した感想を記す。見本の目的はサブディレクトリーを用いて分類されているので、本節をそれらに対応した単位に分割して、コードの寸評を述べる。

animation

クラス matplotlib.animation.FuncAnimation を利用するコードで構成された見本集。 MPEG ファイルを保存するコードが動かないのが残念だ。

animate_decay.py

動的に減衰波形がプロットされる。

basic_example.py

まず色彩豊かな何かのアニメーションがあり、次に折れ線のアニメーションとなる。 FuncAnimationArtistAnimation を別々に使用。

basic_example_writer.py

先ほどのアニメーションをファイルに出力する見本コードのようだが、 animation.writers['ffmpeg'] の処理で実行時例外が発生する。

bayes_update.py

ベータ分布の確率密度関数曲線のプロットのアニメーション例。

  • SciPy が必要。

  • メソッド Axes.axvline の使い方も習える。

double_pendulum_animated.py

振り子の付いた振り子のアニメーション。肘みたいな動きをする。

  • SciPy が必要。常微分方程式を一度解く。

dynamic_image.py

幻想的な色のアニメーション。

  • 関数 matplotlib.pyplot.imshow を併用する。

dynamic_image2.py

幻想的な色のアニメーション。上の物と酷似。

  • たまにホワイトアウトするのは repeat_delay によるものか。

  • FuncAnimation の代わりに ArtistAnimation を利用する。

histogram.py

ヒストグラムのアニメーション。各ビンの数値が変動する。

  • ヒストグラム本体よりもパスを構成するほうに労力を割いている。配列のスライスの活用が素晴らしい。

moviewriter.py

例によって animation.writers['ffmpeg'] の処理で実行時例外が発生する。

rain.py

雨の降っている地面を眺めているかのようなアニメーション。

  • 乱数は NumPynp.random.uniform を利用している。

  • 散布図 (Axes.scatter) を応用している。

random_data.py

区分的一次関数のアニメーション。区間以外が動的に変動する。

  • この中でもっとも単純なコードからなる。

  • 乱数は NumPynp.random.rand を利用している。

simple_3danim.py

空間の一部に含まれるいくつかの点のブラウン運動のようなアニメーション。

  • モジュール mpl_toolkits.mplot3d.axes3d を利用する。

  • モデル部分は 3D データとなり専用のメソッド等を用いる必要があるが、アニメーション部分は 2D だろうが 3D だろうがやることは変わらない。

simple_anim.py

三角関数のプロットのアニメーション。位相が動的に変動する。

  • 関数 np.ma.array を用いれば、欠損要素を含んでもよい配列オブジェクトを生成できる。

strip_chart_demo.py

心電図のようなプロットのアニメーション。

  • 与えられた確率をしきい値として、乱数値またはゼロを評価する関数を構成するところにこのアニメーションの独創性がある。

subplots.py

複数サブプロットがいっせいにアニメーション。

  • クラス matplotlib.animation.TimedAnimation のサブクラスを実装してもよいことを示してもいる。

  • やはり Figure.add_subplot は使いこなすのが難しい。

unchained.py

モダンアート。

api

ここにあるコードは原則的に plt の関数呼び出しを厳しく限定していて、 Figure オブジェクトを生成する関数、関数 plt.show それに関数 plt.close しか利用を認めていない。オブジェクト指向プログラミング風のコードを推奨するということだろう。

agg_oo.py

簡単なプロットを描画して画像ファイルとして保存する。クラス matplotlib.backends.backend_agg.FigureCanvasAgg のデモ。基本。

  • Figure, FigureCanvasAgg/Axes の順にオブジェクトを生成する。最初の二つはコンストラクターから直接生成し、最後のものはメソッド fig.add_subplot を用いる。

  • メソッド canvas.print_figure の呼び出しで画像ファイルを保存する。拡張子がないが SVG ファイルができる。

barchart_demo.py

棒グラフのデモ。基本。

bbox_intersect.py

クラス Bbox のデモ。12 本のランダムな線分と矩形が共通点を持つかテストする。

  • 本当なら関数 plt.gca の戻り値を一時変数に取り、その Axes オブジェクトのメソッドでプロットをすることがこのデモディレクトリーの方針に適う。

  • Bbox のオブジェクトをクラスメソッド Bbox.from_bounds で生成する。

  • 交点の存在テストには Path.intersects_bbox を利用したいので、線分を Path オブジェクトとして一時的に生成する。

collections_demo.py

クラス LineCollection, PolyCollection, RegularPolyCollection と自動スケール調整のデモコード。

  • そのまま実行すると例外 AttributeError: module 'matplotlib.colors' has no attribute 'to_rgba' が発生するので、これらの箇所にあるコードを書き換える必要がある(クラス ColorConverter を利用する)。

  • 珍しく np.random.RandomState を利用している。このクラスは Mersenne Twister 乱数生成器を表す。

  • コレクションクラスのキーワード引数の transOffset には、オブジェクトが所属する Axes.transData を指定する。その後にオブジェクトの .set_transform に独自の Transform オブジェクトを指定する。

  • オブジェクトを Axes.add_collection した後にメソッド .autoscale_view を呼び出す。

colorbar_only.py

カラーバーしか図に載せないデモ。応用。

compound_path.py

区分的曲線(ここでは線分だが)のデモ。基本。

  • 曲線の構成は Path オブジェクトと PathPatch オブジェクトの二段階構造だ。まずデータである Path を作成してから図表要素である PathPatch を作成する。

  • パッチは Axes.add_patch で追加する。

  • 最後に Axes.autoscale_view で描画範囲を適切に設定する。

custom_projection_example.py

Axes をサブクラス化して、独自の投影クラスを作成するデモ。応用。

custom_scale_example.py

Mercator 図法なプロットを自作するデモ。応用。

おおまかに言うと mpl.scale.ScaleBase のサブクラスを適切に実装し、それを関数 mpl.scale.register_scale 呼び出しでクラス自身を与える。その後に Axes を作成して、メソッド .set_yscale に自作クラスのクラスプロパティー .name を指定する。

date_demo.py

プロット x 軸の目盛ラベルに西暦四桁を描画するデモ。また、ステータスバーに表示するマウスポインター位置の座標の表示のカスタマイズもする。モジュール mpl.dates にある各クラスを利用する。

  • メソッド Axis.set_major_locator で 長目盛の位置決めオブジェクトを指定する。

  • メソッド Axis.set_minor_locator で 短目盛の位置決めオブジェクトを指定する。

  • メソッド Axis.set_major_formatter で長目盛のラベル書式オブジェクトを指定する。

  • 面白いことに Axis.set_xlim の値が date 型オブジェクトだ。

  • プロパティー Axis.format_xdata にステータスバーの x 座標表示用書式オブジェクトを指定する。プロパティー Axis.format_ydata も同様。

  • メソッド Figure.autofmt_xdate という、日付ラベル回転調整機能がある。

date_index_formatter.py

より細かい日付ラベルのデモ。

  • メソッド Axis.set_major_formatter の実引数が複雑になっている。自作の関数をさらに FuncFormatter でラップする。

demo_affine_image.py

画像に対する affine 変換のデモ。

  • 自作関数 get_image でダミー画像を生成する。

  • メソッド AxesImage.set_transformAffine2D オブジェクトを指定する。

  • このデモコードにはプロット表示処理がないので、お望みなら自分で書け。

donut_demo.py

同心円の着色に関するデモ。だからドーナツ。

  • これは PathPathPatch のコンビで同心円を辺数の多い多角形で近似することで定義して、「穴」を塗ったり、または塗らないままにする方法を示している。

engineering_formatter.py

クラス EngFormatter のデモ。対数グラフの座標軸ラベルのカスタマイズを示す。

  • このデモでは EngFormatter(unit='Hz', places=1) というオブジェクトを生成する。これにより、目盛ラベルは適当な所で Hz, kHz, MHz, … という単位表示になる。数値は小数点以下一位まで見せる。

  • ダミーデータの構成での NumPy の対数関係の関数の使い方が上手なので参考になる。

filled_step.py

残念だが AttributeError: Unknown property bottom_margin という例外が生じる。可能なら勝手に直したいところだ。

font_family_rc.py

rcParams の中身を直接変更することでフォントを指定するデモ。

  • コードの一番最初で rcParamsimport する必要がある。それ以外の Matplotlib モジュールの import 文を書くのは、その変更処理が全部終わってからとなる?

font_file.py

クラス FontProperties のデモ。

  • フォントパスを指定して FontProperties オブジェクトを生成する。

  • メソッド Axes.set_title のキーワード引数 fontproperties にこのオブジェクトを渡すことで、テキストをこのフォントで描画するようになる。

histogram_path_demo.py

ヒストグラムを PathPatch オブジェクトを使って描画するデモ。

  • ダミーのヒストグラムデータは np.histogram で適当に用意する。それからやや面倒な配列処理で、各棒の輪郭を定義する。

  • Path オブジェクトを生成する。今回はクラスメソッドの .make_compound_path_from_polys を利用する。

image_zcoord.py

画像プロットだが、ステータスバーに強引に z 座標を表示するデモ。

  • プロパティー Axes.format_coord に自作の関数を割り当てる。自作の関数ではステータスバーに表示する文字列そのものを戻すようにする。

joinstyle.py

折れ線の折れた部分のスタイル三種のデモ。

  • メソッド Axes.plot のキーワード引数 solid_joinstyle に対して文字列 'miter', 'round', 'bevel' のいずれかを指定する。

legend_demo.py

凡例のデモ。基本。

  • 関数 plt.legend で凡例を図に表示する。

line_with_text.py

Line2D のサブクラスデモ。どのメソッドをオーバーライドすればよいかわかる。

logo2.py

Matplotlib のロゴバナーを生成、表示するデモ。

  • デモというよりアートと呼びたい。

mathtext_asarray.py

クラス MathTextParser のデモ。

  • 冒頭の関数 rc 呼び出しが気になる。

  • MathTextParser オブジェクトをコンストラクターで生成する。

  • メソッド .to_png で指定した LaTeX の文字列を処理した結果を PNG ファイルに保存する。

  • メソッド .to_rgba で指定した LaTeX の文字列を処理した結果をオブジェクトにする。

  • メソッド Figure.figimage でそれを描画する。呼び出し側が RGB 値を正規化する。

patch_collection.py

主に Wedge パッチのデモコード。

power_norm_demo.py

2D ヒストグラムで PowerNorm オブジェクトを渡すデモ。基本。

  • 関数 plt.hist2d を利用する。見てくれは画像プロットのようだ。このキーワード引数 norm にオブジェクト PowerNorm(gamma) を指定する。gamma は適当なスカラー。

quad_bezier.py

二次 Bézier 曲線のデモコード。基本。

  • Path オブジェクトを生成するときに Path.CURVE3 を適宜指示する。

radar_chart.py

レーダーチャートデモ。応用。

  • PolarAxes のサブクラスとして RadarAxes を定義する。必要なメンバーをオーバーライドする。

  • 関数 mpl.projections.register_projection にこの .name を指定する。

sankey_demo_basics.py

クラス Sankey のデモコード。

  • メソッド .add で矢印形状を追加できる。形状が確定したら .finish を呼ぶ。この戻り値を介して図式のスタイルを調整する。

sankey_demo_links.py

クラス Sankey のデモコード。メソッド .add を駆使して、たいへん長い Sankey 図を生成する。

sankey_demo_old.py

クラス Sankey を利用せず、自力で Sankey 図を描画するデモ。研究。

sankey_demo_rankine.py

クラス Sankey を利用して Rankine サイクルの図を描くという、かなり実践的なデモ。

  • メソッド .add の引数が複雑なので、何とかしたい。

scatter_piecharts.py

散布図のマーカーが円グラフというふざけたデモコード。

skewt.py

斜交座標系のデモコード。研究。

  • クラス XTick, XAxis, Spine, Axes からそれぞれのサブクラスを定義する。

  • 関数 mpl.projections.register_projectionAxes のサブクラスの .name を指定する。

  • プロットデータの生成に np.loadtxt を使っているのが面白い。

  • メソッド Axes.semilogy で y 軸が対数寸法になる。

  • メソッド Axes.axvline は x 一定の線を引くものだが、このデモでは斜めになる。

  • ScalarFormatterMultipleLocator の使用例も見られる。

span_regions.py

クラス BrokenBarHCollection のデモコード。

  • メソッド Axes.axhline は y 一定の線を引く。

two_scales.py

プロットの両側に y 軸目盛を付けるデモコード。

unicode_minus.py

マイナス記号差し替えデモ。

  • rcParams['axes.unicode_minus'] = False とすると、マイナス記号に Unicode のそれを使わなくなる。代わりにハイフンになる。

watermark_image.py

図の背景に透かしを入れるデモ。

  • アルファチャンネルありの画像をメソッド Figure.figimage に渡す。

watermark_text.py

図の背景に透かしを入れるデモ。

  • 単にメソッド Figure.text の呼び出しでキーワード引数を alpha=0.5 のようにすればよい。

axes_grid1

モジュール mpl_toolkits.axes_grid1 に関連する見本の集まり。

demo_axes_divider.py

複数サブプロット、カラーバーの配置方法のデモ。

  • デモコード定義の関数 get_demo_image はプロット対象となるデータを NumPy の配列オブジェクトとして返す。この関数は他のデモコードでも登場する。

  • 最初のサブプロットでは単にデモデータを描画する。メソッド Axes.imshow でイメージを描画し、さらに関数 plt.colorbar でカラーバーを付属させる。

  • 次のサブプロットでは、先の処理をより複雑にすることでカラーバーの高さをイメージプロットのそれに合わせる。クラス SubplotDivider, LocatableAxes, Size とメソッド Figure.add_axes を使いこなす力量を要求される。

  • 次のサブプロットもやることは同じだが、手続きが簡略化した。関数 make_axes_locatable をサブプロットに適用してレイアウトマネージャーのようなものを利用する。

  • 最後のサブプロットは同じイメージプロットを横一列に並べる。つまり、先の例でカラーバーの代わりに元のイメージプロットと同じものを置く。

demo_axes_grid.py

さらに複雑な複数サブプロットの配置方法のデモ。

  • 最初のサブプロット群は田の字に配置するもの。クラス ImageGridFigure オブジェクトを渡す。

  • 次のサブプロット群も田の字だが、カラーバーをひとつ付属させる。横長カラーバーが田の字の上部に出る。ImageGrid コンストラクターの後半のキーワード引数がそれを指示する。

  • 次のサブプロット群も田の字だが、カラーバーがそれぞれに付属する。 ImageGridcbar_mode="each" がポイントだ。

  • 最後のサブプロット群も田の字。カラーバーも個別。ただしカラーバーの範囲をサブプロットごとに変える。

demo_axes_grid2.py

ImageGrid のデモコード。

  • 最初のグループはサブプロットそれぞれにカラーバーを付属させる。ImageGrid の引数については以前のデモで理解できるだろう。

  • デモコード定義の関数 add_inner_title はサブプロット内にテキストを配置する。主にクラス AnchoredText を利用するが、それ以外の機能はあまり馴染みがない。

  • 次のグループはサブプロットにひとつのカラーバーを共有させる。ImageGridcbar_mode="single" がポイントだ。

demo_axes_hbox_divider.py

サブプロットを並べて、それにまたがるようにテキストを入れるデモ?

  • モジュール mpl_toolkits.axes_grid1.axes_size にあるクラス AxesX, AxesY, Scaled, Fixed を利用してレイアウトマネージャー的な役割があるクラス HBoxDivider のオブジェクトを生成する。このマネージャーを最初に作った Axes のいずれにも set_axes_locator する。

  • テキスト部は実は Axes オブジェクト。メソッド Axes.annotate でテキスト内容とレイアウト内容を指定する。

demo_axes_rgb.py

モジュール mpl_toolkits.axes_grid1.axes_rgb を利用したサブプロットの RGB 分解のデモ。

  • 関数 make_rgb_axes でサブプロットから RGB 別のサブプロットを生成する。

  • デモコード内で定義された、画像から RGB 値を分解するコードの処理内容が理解できない。謎のスライス。

  • クラス RGBAxesFigure からサブプロットを内部に 4 つ持つサブプロットを生成するサブプロットそれぞれには .RGB, .R, .G, .B でアクセスする。

  • この場合にはメソッド Axes.imshow_rgb で描画内容生成。

demo_colorbar_with_inset_locator.py

カラーバーを関数 mpl_toolkits.axes_grid1.inset_locator.inset_axes で実現するデモ。

  • 関数 inset_axes で既存のサブプロットの内側に指定サイズの新規サブプロットを作成する。それから plt.colorbar のキーワード引数 cax としてそれを指定する。

demo_edge_colorbar.py

クラス AxesGrid のデモ。

  • 最初のグループではカラーバーを二個ずつ共有するデモ。下に付く。クラス AxesGridImageGrid のように使うが、キーワード引数 cbar_mode="edge" がポイント。

  • 次のグループではカラーバーを二個ずつ共有するデモ。右に付く。

  • ところで plt.get_cmap("autumn") 等が気になる。

demo_imagegrid_aspect.py

クラス ImageGrid のデモ。

  • コンストラクターの引数 aspect=True でアスペクト比を指定可能なオブジェクトを作成することを指示する?

  • アスペクト比自体は set_aspect を用いる。

inset_locator_demo.py

モジュール mpl_toolkits.axes_grid1.inset_locator のデモ。サブプロット内に別のサブプロットを入れる?

  • 関数 zoomed_inset_axes で既存のサブプロットから指定倍率を持つ新規サブプロットを作成する。

inset_locator_demo2.py

モジュール mpl_toolkits.axes_grid1.inset_locator のデモ。サブプロット内の一部を拡大して表示する。

  • 関数 mark_inset でこれらのサブプロットの位置関係を指定する。

make_room_for_ylabel_using_axesgrid.py

関数 mpl_toolkits.axes_grid1.axes_divider.make_axes_area_auto_adjustable その他のデモ。サブプロットのマージン?の大きさを自動調整可能にする?

parasite_simple2.py

クラス SubplotHost のデモ?

  • SubplotHost のコンストラクターに Figure オブジェクトと寸法を指定する。

  • あとは何をやりたいのかわからない。

scatter_hist.py

関数 mpl_toolkits.axes_grid1.make_axes_locatable のデモ。ヒストグラム二個と散布図一個をウィンドウに表示する。

  • まずは単に散布図を定義し、それを引数にして make_axes_locatable を呼ぶ。この戻り値オブジェクトのメソッド append_axes を呼び出して、散布図の上や右に新しくサブプロットを作成する。

  • 棒が横に伸びるヒストグラムを作るには hist の引数に orientation='horizontal' を指定する。

simple_anchored_artists.py

各種図形、特にモジュール mpl_toolkits.axes_grid1.anchored_artists にある図形要素をサブプロットに配置するデモ。

  • クラス AnchoredText は小さいテキストラベル。

  • クラス AnchoredDrawingArea はサブプロット内の小さな矩形。コンテナーとして振る舞う。この例では Circle を別途作成し、自身の管理する add_artist により含める。

  • クラス AnchoredEllipse はサブプロットに所属する小さな楕円。

  • クラス AnchoredSizeBar はサブプロットに所属する「縮尺を表す線」。

  • 上記のクラスはすべて AnchoredOffsetBox の間接サブクラスである。オブジェクトはどれも Axes.add_artist に渡すことになる。

simple_axesgrid.py

クラス ImageGrid のデモ。

  • ImageGrid のコンストラクターに Figure オブジェクトと格子の寸法を指定する。

  • ここでは適当に定義した線形データを imshow に渡している。

simple_axesgrid2.py

同じくクラス ImageGrid のデモ。画像を三分割してそれぞれを三つの格子それぞれに描画する。

  • ImageGrid の引数で格子間の長さを指定する等する。

  • 画像の分割は単に NumPy の配列をスライスするだけで得られる。

simple_axisline4.py

座標軸の目盛ラベルデモ。サブプロットにサインカーブを描き、上辺は円周率単位で、下辺は 1 単位で目盛を付ける。

  • メソッド Axes.twin でサブプロット上辺の座標軸を表すオブジェクトが得られるので、これに対して set_xticks, set_xticklabels を操作する。

axisartist

モジュール mpl_toolkits.axisartist する見本の集まり。

demo_axisline_style.py

プロットの座標軸と枠線の処理方法についての見本。

  • クラス SubplotZero は図の内部にある Axes オブジェクトを生成・操作するメソッドを与える。この見本ではオブジェクト fig から生成する。

  • 両座標軸ともに正の方向に矢印の矢先を描くために ax.axis[direction].set_axisline_style("-|>") する。

demo_curvelinear_grid.py

クラス Subplot, SubplotHost, GridHelperCurveLinear, ParasiteAxesAuxTrans の見本。直交座標のプロットと極座標のプロットを描いて、それぞれにおいてグリッドや目盛をカスタマイズする。

  • かなり手が込んでいる。

demo_curvelinear_grid2.py

x 軸の目盛間隔が一様でないデモ?

  • 先ほどの見本もそうだが、クラス GridHelperCurveLinear の操作法が面倒そうだ。

demo_floating_axes.py

サブモジュール mpl_toolkits.axisartist.floating_axes デモ。三個のサブプロットを生成する。

  • サブプロット全体に affine 変換を施すことができる。それにはクラス Affine2D のオブジェクトを生成して適切な変換を定義しておく必要がある。それから別のオブジェクトに引き渡す。

  • 直交座標系の棒グラフでは floating_axes.GridHelperCurveLinearfloating_axes.FloatingSubplot を上手く使う。

  • バウムクーヘンのような極座標系の散布図では FixedLocator, DictFormatter, MaxNLocator の各クラスを利用して、座標軸の目盛ラベルをカスタマイズする。

  • 扇型の極座標系の散布図ではモジュール mpl_toolkits.axisartist.angle_helper の機能を上手く使う。

demo_floating_axis.py

極座標?

  • Matplotlib 本体コードで RuntimeWarning が送出される。とりあえずサブプロットは表示されるが、この内容で正しいかは知らない。

demo_parasite_axes2.py

密度、温度、速度。何やら座標軸が多い。

  • 関数 mpl_toolkits.axes_grid1.host_subplot で生成したオブジェクトからメソッド twinx を二度呼び出す。

  • このデモはモノクロでわかりにくい。色を変えてみよう。

color

色に関係する処理の見本集。

colormaps_reference.py

Colormap Vega10 is not recognized というエラーが出て完全には動作しない。

  • 動作するものについては、色見本が画面に描かれる。

color_cycle_default.py

現在存在しない set_facecolor への参照があるコード。動作しない。

color_cycle_demo.py

RGBY と CMYK とでプロット曲線の色を変えていくデモ。

  • 関数 plt.rc の呼び出しでプロット曲線の特性を指定することができる。

  • またはメソッド Axes.set_prop_cycle を用いてもよい。

named_colors.py

現在存在しない BASE_COLORS への参照があるコード。動作しない。

event_handling

キーボードやマウス操作による対話的な処理をどう実現するかを示す見本集。

close_event.py

サブプロットのイベントハンドラーの指定方法を示すデモ。基本。

  • このデモではウィンドウを閉じるイベントを扱う。

  • メソッド Figure.canvas.mpl_connect を呼び出すことでサブプロットの「白い部分」上のイベントハンドラーを指定できる。引数にはイベント名を表す文字列と、発動される関数なり関数オブジェクトなりを渡す。

data_browser.py

マウスピック(クリック)およびキー押しイベントのデモ。

  • イベントハンドラーの signature の要件は、引数にイベントオブジェクトを取ることか。例えばキーイベントならば event.key に、マウスピックイベントならば event.mouseevent にそれぞれアクセスできる。

  • Axes.plot のキーワード引数 picker=5 にも注意。これはマウスピック座標の余裕を指示する値である。CAD によくあるパラメーター。

  • 二点間の距離の平方を計測するのに関数 np.hypot を利用する。こんな便利なものが存在していたか。

  • スクリプトの最後の if ブロック内に宣言された変数は Python 的には全て global 扱いであることに注意。

figure_axes_enter_leave.py

マウスカーソルの移動処理のデモ。FigureAxes の両方について。

  • イベント名は (axes|figure)_(enter|leave)_event のような文字列だ。Axes についてのイベントハンドラーに渡されるオブジェクトには .inaxes が、Figure についてのそれには .canvas が利用可能。

  • マウスカーソルのある要素に色が塗られる。これはメソッド .patch.set_facecolor を呼ぶ。

idle_and_timeout.py

アイドルイベントのデモだが、こういうことはしないで代わりに animation の機能を使うこと。

keypress_demo.py

キー押しイベント処理のデモ。基本。

  • キー X を押すたびに x 軸ラベルが出たり消えたりするというもの。

  • イベント名は key_press_event で、ハンドラーでは引数オブジェクトの属性値 .key を参照する。

  • ラベルの表示処理はメソッド .set_visible 等を利用する。

lasso_demo.py

いわゆる投げ縄選択のデモ。

  • そのまま実行すると例外 AttributeError: module 'matplotlib.colors' has no attribute 'to_rgba' が発生するので、これらの箇所にあるコードを書き換える必要がある(クラス ColorConverter を利用する)。

  • クラス Lasso を利用する。

  • イベントとしては button_press_event を使う。

  • 投げ縄を描く際にいろいろと面倒なことをしている。特に Figure.canvas.widgetlock が絡む処理が曲者。ある種のロック操作が含まれる。

legend_picking.py

凡例部分のピックイベント処理デモ。凡例の線をピックすると、対応する折れ線(このデモでは折れはないが)の表示状態が切り替わる。

  • イベントとしては pick_event を使う。

  • 凡例を生成するにはメソッド Axes.legend を呼ぶ。戻り値が凡例オブジェクト。

  • 凡例内の線にアクセスするには凡例に対するメソッド get_lines でよい。

  • 折れ線の表示処理はメソッド .set_visible 等を利用する。

looking_glass.py

マウスドラッグを実装するデモ。

  • 詳細は省くが、マウスイベントを三種類処理する。

  • 円と線群とが重なり合う部分については、線のほうの見え方を変えたい。これには線に対するメソッド .set_clip_path を用いる。

path_editor.py

Bézier 曲線の編集デモ。案外面倒なコードになっている。

  • draw_event というイベントがある。キャンバスの描画を自力で行うとでも言うのか。

  • 全体的に FigureCanvas のメソッド呼び出しが重要らしい。あまり見かけないものもここでは利用する。

  • 初期状態ではこのパスは閉曲線に見えるが、実際には始点終点に対応する制御点(同じ座標だが)が一致しているだけの開曲線だ。

pick_event_demo.py

四種のサブプロット上におけるピック処理のデモ。基本。

  • ピックイベントの処理は pick_event という名前になる。

  • 最初のウィンドウでは点プロットと棒グラフをピックするデモ。ピックされたオブジェクトが Line2D なのか Rectangle なのか Text なのかでイベントオブジェクトから得られる属性情報が異なる。

  • 次のウィンドウも点プロットのピックデモ。ピックした座標を得るには .pickx 等を用いる。

  • メソッド Axes.plot のキーワード引数 picker に関数を渡す。この自作関数ではピック座標とその近傍のプロット点との距離をテストしているらしい。

  • 次のウィンドウでは散布図のピックのデモを行う。今度はメソッド Axes.scatter のキーワード引数 picker には True を指定する。

  • 最後のウィンドウは画像のピックデモ。メソッド Axes.imshow のキーワード引数 picker には True を指定する。

pick_event_demo2.py

点をピックすると、それに対応する元データを別ウィンドウで表示するデモ。

  • 元データは np.random.rand による。

  • ピックさせるデータは np.meannp.std による。

  • ピックハンドラーの引数から得られる event.ind にはどうもプロット点列の配列としてのインデックス(複数)であるようだ。

pipong.py

後述の pong_gtk.pyimport するモジュール。

poly_editor.py

正多角形の頂点をマウスでドラッグするデモ。

  • path_editor.py のデモとコードの構造が同じ。

  • Line2DPolygon のキーワード引数 animated=True が気になる。

  • 角度ゼロ付近の頂点の配置が怪しい。

pong_gtk.py

準備不足なので ImportError: No module named 'gobject' となる。

resample.py

ビュー範囲を変えるとそれに連動してプロットの標本数を最適化して再描画するデモ?こちらの思うようには動作しないようだ。

test_mouseclicks.py

マウスボタンイベント処理のデモ。基本。

  • ダブルクリックかどうかはイベントハンドラーの引数オブジェクトの属性 .dblclick でテストできる。

timers.py

タイマーのデモ。

  • これまでのイベントハンドラーと色合いが異なり、タイマーオブジェクトの生成が必要。

  • コメントアウトのコードも注意。

trifinder_event_demo.py

マウスポインターを含むプロット三角形をハイライトするデモ。面白い。

  • デモデータの構成コードは要研究。

  • クラス Triangulation を利用する。

  • このオブジェクトをプロットするには関数 plt.triplot を呼ぶ。

  • 終盤の Polygon オブジェクトは何だろうか。

viewlims.py

Mandelbrot 図形をズームインするデモ。

  • 図形の生成コードは Mandelbrot.__call__ にあるこの 10 行程度に収まっている。

  • メソッド Axes.callbacks.connect でハンドラーを定義する。Qt 風に言うと signal を slot に connect する。

  • 素材の選択がある意味不適切な気がする。ズームしても元と変わらない。

zoom_window.py

散布図の拡大図を別ウィンドウで表示するデモ。

  • メソッド Axes.set_xlim 等を用いてビューの範囲を更新する。

  • 別ウィンドウは開きっぱなし。

images_contours_and_fields

画像およびベクトル場関連といったところか。

contourf_log.py

グラデーションになっていないが、意図通りか?コード量は多くはないが、どのステップの処理も珍しい。

  • 二変数 Gauss 分布関数が mlab.bivariate_normal として実装されている。

  • 関数 plt.contourf で等高線プロットを描画する。

  • 関数 plt.colorbar でカラーバーを図のそばに付属させる。

image_demo.py

ウィンドウに Lovelace 伯爵夫人の画像を表示する見本コード。

  • 画像の読み込みは関数 plt.imread で行い、戻り値を plt.imshow に渡せばよい。

  • plt.axis('off') して座標軸を非表示にしておく。

image_demo_clip_path.py

ウィンドウに Grace Hopper 准将の画像を表示する見本コード。

  • 円形にくり抜いてあるが、これは画像オブジェクトのメソッド set_clip_path で行う。引数のパッチオブジェクトはここでは Circle オブジェクトを採用している。

interpolation_methods.py

色補間 18 種のカタログ。

  • 18 個ものサブプロットオブジェクトを plt.subplots(3, 6, ...) で生成している。

  • メソッド imshow のキーワード引数 interpolation に指定する文字列が Matplotlib から得られるとよいだろう。

interpolation_none_vs_nearest.py

色補間ナシと最近補間の比較デモ。

  • 補間 none がよく効くのは大きな画像を小さく表示するときで、補間 nearest がよく効くのは小さな画像を大きく表示するときらしい。

  • Matplotlib 自体の話題ではないのだが、スクリプト後半のコメントに PDF を PNG に変換する処理について、興味深いことが書かれている。

pcolormesh_levels.py

Axes.pcolormeshAxes.contourf の比較デモ。メッシュ対点。

  • クラス mpl.colors.BoundaryNorm はカラーマップのインデックスを離散的な(整数の)区間に基いて生成する。このオブジェクトをメッシュプロット関数に渡すので、メッシュのほうはモザイクっぽい見栄えになる。それに対して、点のほうは曲線的な等高線がくっきりと見える。

  • plt.tight_layout を呼び出し、上下のサブプロットの座標軸の目盛ラベルが重なり合わぬように、隙間を調整する。

streamplot_demo_features.py

ベクトル場プロットデモ。

  • メソッド Axes.streamplot で描画する。引数には座標とベクトルを意味する配列を必要とするものがある。

streamplot_demo_masking.py

ベクトル場プロットデモのはず。

  • 実行時に MaskedArrayFutureWarning がスクリプトから送出される。これを修正できるくらいに理解を深めたい。

streamplot_demo_start_points.py

不明。

  • ValueError: operands could not be broadcast together with shapes (6,) (100,) (6,) なる例外が送出される。これを修正できるくらいに理解を深めたい。

lines_bars_and_markers

ここには初歩的な見本コードがある。

barh_demo.py

水平棒グラフの見本。

  • 関数 plt.barh でデータを描画する。

fill_demo.py

プロット曲線と x 軸とで囲まれた領域に色を塗る単純なデモコード。

  • 単に関数 plt.fill(x, y) を呼び出すだけでよい。プロット曲線と閉領域の着色を同時に行う。

fill_demo_features.py

複数のプロット曲線と x 軸とで囲まれた領域に色を塗る単純なデモコード。

  • 関数 plt.fill の呼び出しが一度で済むことを理解すること。

line_demo_dash_control.py

プロット曲線を破線で描く方法を示す見本。

  • まずは plt.plot の引数に文字列 -- を指定して破線にする。

  • これだけでも破線になるが、点描のパターンを set_dashes で細かく指定できる。

line_styles_reference.py

プロット曲線の線スタイルのカタログ。

marker_fillstyle_reference.py

マーカースタイルのカタログ。

  • Line2D.fillStyles の要素が有効なスタイル。これをプロット関数の fillstyle として指定する。

  • マーカーはだいたいマルに縦線や横線が入った記号で、半円部が別の色で塗られている。

marker_reference.py

マーカースタイルのカタログ。塗りナシと塗りアリの二種類を展示するデモ。

  • マーカーを指示するのに有効な値は Line2D.markers, Line2D.filled_markers, Line2D.filled_markers から得られる。例えば:

    In [1]: Line2D.filled_markers
    Out[1]: ('o', 'v', '^', '<', '>', '8', 's', 'p', '*', 'h', 'H', 'D', 'd')
    
scatter_with_legend.py

凡例付き散布図のデモ。

  • 散布図のプロット関数は plt.scatter だ。

  • 凡例は関数 plt.legend を呼び出す。

misc

雑多なコード例を集積したディレクトリーだろう。すぐに動作しないコードもある。

contour_manual.py

クラス ContourSet のデモコード。

font_indexing.py

開発者向けコード。というより、フォントファイルがなくて動作しない。用意すれば動くだろう。

ftface_props.py

開発者向けコード。というより、フォントファイルがなくて動作しない。用意すれば動くだろう。

image_thumbnail.py

指定ディレクトリーにある全ての PNG ファイルからサムネイル画像を生成するデモコード。モジュール mpl.image に PIL と似た機能があるようだ。

longshort.py

インターネットから CSV ファイルを取得して、データを読み込み、プロットを表示するデモコード。

  • Python 標準ライブラリーの関数 urllib.request.urlretrieve でファイルをダウンロードする。

  • 関数 mpl.mlab.csv2rec で CSV データをオブジェクト化する。それから CSV データを編集する。

  • メソッド Figure.autofmt_xdate でラベルの日付文字列を適宜見やすくさせる。

multiprocess.py

Python の multiprocessing.Processmultiprocessing.Pipe を絡めたデモコード。

  • matplotlib.use('GtkAgg') しているが、これが必要なのか。

  • ImportError: No module named 'gobject' が発生してダメ。

rasterization_demo.py

ビットマップ化関係か?

  • ダミーのメッシュプロットを生成するのに np.meshgrid が向いている。

  • ポイントは Axis.pclormesh の戻り値オブジェクトに対する set_rasterized(True)set_zorder(-20) だろう。

  • 最後に関数 plt.savefig を呼び出して PDF, EPS, SVG ファイルを出力する。

  • 生成した SVG ファイルを Inkscape で開こうとしたらモッサリしてダメ。それ以外のファイルはそれぞれのビューワーで普通に閲覧できた。

rc_traits.py

ImportError: No module named 'traits' となってダメ。

rec_groupby_demo.py

AttributeError: module 'numpy' has no attribute 'string0' となってダメ。

rec_join_demo.py

AttributeError: module 'numpy' has no attribute 'string0' となってダメ。

sample_data_demo.py

ウィンドウに Lovelace 伯爵夫人の画像を表示する見本コード。

  • 関数 mpl.cbook.get_sample_data のデモコード。あとは plt.imreadplt.imshow を呼び出す。

svg_filter_line.py

プロットを SVG データ化し、かつ XML コードをそこへ追加するようなデモコード。

  • 関数 plt.savefigBytesIO オブジェクトに対して作用させているのがポイント。

  • Inkscape で開くと、折れ線グラフにドロップシャドウが付いているのが目視できる。デモコードの後半部で、このエフェクトフィルターに相当する XML コード片を XML オブジェクトツリーに自力で挿入している。

  • UserWarning が発生するので、気になるかもしれない。

svg_filter_pie.py

コードの構造は上記デモコードと同様。円グラフ版。

tight_bbox_test.py

プロットをウィンドウだけでなく、さまざまな形式のファイルに出力するデモコード。

In [1]: %run ./misc/tight_bbox_test.py
saving tight_bbox_test.png
saving tight_bbox_test.pdf
saving tight_bbox_test.svg
saving tight_bbox_test.svgz
saving tight_bbox_test.eps
  • 関数 plt.savefig を用いる。ファイル形式は最初の引数のパス文字列の拡張子で自動判別されるらしい。

  • 関数呼び出し一発で PDF ファイルにプロットを出力できるのは強力。

mplot3d

立体的なモデルをウィンドウ上で表現する方法を示す見本集。

2dcollections3d_demo.py

プロット空間内にプロット曲線と散布図を描くデモ。基本。

  • 明示的な importfrom mpl_toolkits.mplot3d import Axes3D が必要。この他のデモでも、コード中に明確に 3D 系クラスなり関数なりが出て来ない場合にはこのようなダミーの import 文を必要とする。

  • メソッド Figure.gca のキーワード引数が projection='3d' 必要。この戻り値のオブジェクトの型が Axes3D なのだろう。

  • メソッド Axes.plot にも Axes.scatter にもキーワード引数 zdir を指定する。この例ではサンプルデータは平面的なので、その平面の法線方向の座標成分を指示する。この事はこの他のデモコードすべてのプロット系メソッドに言える。

  • メソッド Axes3D.set_xlim3d 等でプロット空間の座標成分ごとの範囲を指定する。

  • メソッド Axes3D.view_init でカメラの位置と姿勢を指示する。引数の与え方が難しそうだ。

bars3d_demo.py

平面的棒グラフを奥行き方向に配列するデモ。基本。

  • メソッド Figure.add_subplot のキーワード引数が projection='3d' 必要。

contour3d_demo.py

関数 axes3d.get_test_data を利用してプロット空間内に等高線図を描くデモ。基本。

  • メソッド Axes.contour に三次元分の点列を渡す。

  • メソッド ContourSet.clabel で等高線にラベルする。

contour3d_demo2.py

その等高線をリボン化するデモ。

  • メソッド Axes.contour のキーワード引数 extend3d=True とすることで、描画される等高線は高さ方向に幅広くなる。

contour3d_demo3.py

その等高線データをプロット曲面とその射影を等高線図として表現するデモ。

  • 曲面プロットはメソッド plot_surface による。三次元分の点列を渡す。

  • メソッド Axes.contourzdir を各座標成分ごとに呼び出すことで、等高線プロットを各座標平面に射影する。このときキーワード引数 offset を指定して、若干浮かせる。

contourf3d_demo.py

隣接する等高線同士でその対応する「高さ」部分を塗るデモ。基本。

  • メソッド Axes.contourf を用いる。

contourf3d_demo2.py

その等高線データをプロット曲面とその射影を等高線図として表現するデモ。塗りアリ版。

  • メソッド Axes.contourf を用いる。

custom_shaded_3d_surface.py

これは高級。

  • オブジェクト np.s_ は配列の添字からなる tuple オブジェクトを生成するもの。

  • ここでクラス LightSource のコンストラクターに与えている実引数はそれぞれ方位角と仰角を指定する。

  • このオブジェクトについてメソッド shade を呼ぶことで色データ rgb を算出する。座標成分 z しか必要としない?

  • それから Axes.plot_surface を呼び出す。キーワード引数 facecolors に今得た RGB データを指定する。自分で色を与えるので shade=False とするのだろう。

hist3d_demo.py

3D 棒グラフのデモコード。基本。

  • 関数 np.histogram2d でヒストグラムデータを作成する。

  • さらに 16 本の棒の位置を決める配列を np.meshgdi 等で決める。

  • メソッド Axes.bar3d で棒グラフを描画する。注目したいのはキーワード引数 zsort='average' で、この影響でビューをグリグリ回転させると、ある棒の辺と隣の棒の面との前後関係の描画が乱れることがある。

lines3d_demo.py

3D 曲線のデモコード。基本。

  • メソッド Axes.plot に三次元分の点列を渡す。

lorenz_attractor.py

Lorenz attractor を描画するデモ。

  • 点列を生成するコードはさすがに凝っているが、描画コードはたいへん基本的。

mixed_subplots_demo.py

同一 Figure に 2D の Axes と 3D の Axes を掲載するデモコード。

  • 二度目のメソッド Figure.add_subplot の呼び出しには、キーワード引数 projection='3d' を指定する。

offset_demo.py

テキストをオフセットして描画するデモらしいが、見てもよくわからない。

  • メソッド Axes.plot_surface の x 軸と y 軸データの値が + 1e5 されている。これが要点らしい。

pathpatch3d_demo.py

テキストをプロット空間内に描画するデモ。これは参考用だ。

  • モジュール mpl_toolkits.mplot3d.art3d に関数 pathpatch_2d_to_3d というのがある。

  • ちなみに実行時間がけっこう長い。裏で LaTeX が起動する。

polys3d_demo.py

平面的折れ線グラフ(を輪郭とする多角形)を奥行き方向に配列するデモ。基本。

  • そのまま実行すると例外 AttributeError: module 'matplotlib.colors' has no attribute 'to_rgba' が発生するので、これらの箇所にあるコードを書き換える必要がある(クラス ColorConverter を利用する)。

  • メソッド Axes.add_collection3d をキーワード引数 zdir の指定と共に呼ぶ。ステンドグラス的な多角形は PolyCollection でよい。

quiver3d_demo.py

箙プロットのデモ。基本。

  • AttributeError: Unknown property normalize という例外が出るので、 norm=True に修正する。

  • データとなるベクトル群の全始点を関数 np.meshgrid で一気に作成する。

  • メソッド Axes.quiver で箙プロットを描画する。

rotate_axes3d_demo.py

謎。

  • plt.show() が抜けているので補足したが、それでも謎。

scatter3d_demo.py

散布図デモ。基本。

  • メソッド Axes.scatter に三次元分の点列を渡す。

subplot3d_demo.py

曲面プロットデモ。基本。

  • メソッド Axes.plot_wireframe で曲面をワイヤーフレームで描画する。

surface3d_demo.py

曲面プロットデモ。基本。

  • Axes.zaxis にアクセスできることに注意。

surface3d_demo2.py

曲面プロットデモ。基本。

surface3d_demo3.py

曲面プロットにおいて面の各マスに色を指定するデモ。

  • メソッド Axes.plot_surface のキーワード引数 facecolors に色値からなる二次元配列を渡す。

surface3d_radial_demo.py

曲面プロットデモ。基本。

  • メソッド Axes.plot_surface は極座標は知らないので、そのような点データを呼び出し側で直交座標系に変換する必要がある。

text3d_demo.py

テキストデモ。基本。

  • メソッド Axes.textAxes.text2D とがある。

  • キーワード引数 zdir にはベクトルを表す配列を渡すこともできる。

tricontour3d_demo.py

Triangulation および plt.tricontour のデモコード。曲面 tessellation による描画。3D CAD でよく見かける手法に似ている。

  • ある円周からクラス Triangulation を利用して三角形格子を得る。オブジェクト triang.triangles は点列の添字三つ組の配列である。

  • メソッド Triangulation.set_mask で要らない三角形を指定?

  • 関数 plt.tricontour で tessellation をプロットする。ここで Triangulation オブジェクトと点列の z 成分配列を指定する。

tricontourf3d_demo.py

Triangulation および plt.tricontourf のデモコード。上のと同じ。

trisurf3d_demo.py

Axes.plot_trisurf のデモコード。

  • おそらく Axes.plot_trisurf に渡す点列データに何かの制約があると思われる。そうでないと tessellate できない。

  • 引数に x, y, z および Triangulation オブジェクトを渡す方法と、 Triangulation および z を渡す方法が許される。

trisurf3d_demo2.py

変わった曲面のデモ。

wire3d_animation_demo.py

ワイヤーフレーム曲面のアニメーションデモ。

  • MatplotlibDeprecationWarning が発生するが、気にしない。

  • 関数 plt.pause を利用。これがマズい。

wire3d_demo.py

ワイヤーフレーム曲面デモ。基本。

wire3d_zero_stride.py

ワイヤーフレーム曲面デモ。基本。

  • 曲面プロット系メソッドのキーワード引数 rstridecstride にゼロを指定すると、曲面上の x または y の値が一定の曲線しか描かれない。

pie_and_polar_charts

円グラフと極座標グラフの見本コード集。

pie_demo_features.py

よくある円グラフの見本。

  • 円グラフはメソッド Axes.pie で実現する。

  • Axes.set_aspect('equal') をしないと、円が円に見えなくなる。

  • 扇型は既定では反時計回りに配列されていく。この振る舞いを変える方法もある。

polar_bar_demo.py

極座標系の中心から棒が伸びるようなグラフの見本。棒というか扇型になる。

  • これは plt.subplot の呼び出し時に projection='polar' を指定するのが本質的だ。

  • 謎のメソッド plt.cm.viridis で「棒」部分の色を決めている。これは色の見本コード集のところで学習しよう。

polar_scatter_demo.py

極座標グラフで散布図を実現する見本。

  • これも plt.subplot の呼び出し時に projection='polar' を指定する。

  • 散布図を実現するのはメソッド Axes.scatter だ。

  • サンプルデータは乱数。

pylab_examples

Todo

調査する。

scales

グラフの各軸の目盛寸法を線形的だけではなく、対数的にも設定できる。詳しくは matplotlib.pyplot.Axes.set_yscale 等のヘルプを当たって欲しい。

scales.py

それぞれ異なる Y 軸の目盛寸法の特性のあるサブプロットを四つ描画し、同一データをプロットする。

  • 寸法の種類は linear, log, symlog, logit からなる。 symlog はプラスマイナス対称であり、logit はクリッピングあり。

  • プロットデータは Gauss 分布 np.random.normal(0.5, 0.4, 1000) を加工したものとする。これでほぼ線形に分布した点列が得られる。この加工の技法にも注目したい。

shapes_and_collections

artist_reference.py

Matplotlib の各種図表要素 (artists) の図解のようなものを描く見本コード。

  • モジュール mpl.patches には Circle, Rectangle, Wedge, RegularPolygon, Ellipse, Arrow, FancyBboxPatch という図表的要素クラスがある。

  • PatchCollection というクラスでこれらの要素を集約することができる。

  • レイアウトを微調整する関数 plt.subplots_adjust を忘れないでおきたい。

path_patch_demo.py

区分的 Bézier 曲線の構成方法の見本。mpl.path.Path, mpl.path.PathPatch の利用法が理解できる。

scatter_demo.py

散布図の見本。

  • この見本コードが散布図を描画するもっとも単純なものだろう。

  • 与える点列データは座標だけでなく大きさと色も指定することができる。

  • 関数 plt.scatter による。

showcase

書籍に掲載されていても遜色のないイラスト群。

bachelors_degrees_by_gender.py

アメリカ合衆国における女性の専攻別学位授与率のプロット。

  • 見るべきところは多々あるが、とりわけ目を引くのはサンプルデータの出処である。関数 matplotlib.cbook.get_sample_data は面白そうだ。

integral_demo.py

典型的な定積分のイラスト。

  • 関数 plt.text 等 LaTeX 数式を指定できることは学習済み。

  • 求積領域の形状を Polygon を用いて表現する。

xkcd.py

謎のスケッチスタイル適用。

  • 棒グラフはメソッド Axes.bar で描画する。

specialty_plots

シェーディング(のようなもの)が関係する画像を生成する見本コード集。

advanced_hillshading.py

三種類の異なるデモを含むコード。

  • plt.cm.cupper という銅の色みを扱うオブジェクトがある。

  • モジュール mpl.colors にあるクラス LightSource のオブジェクトがメソッド shade で色の数値を評価する。

  • メソッド Figure.colorbar が色の棒をサブプロットの側に配置する。

  • モジュール mpl.colors にあるクラス Normalize のオブジェクトは与えらえた数値を指定範囲内に制限する。

hinton_demo.py

Hinton 図のデモコード。白と黒でさまざまな大きさの正方形を格子上に描画する。

  • これは面白いから Matplotlib 本体に組み込んでもよいのでは。

  • 関数 np.ndenumerate は馴染みがなかった。いつか活用したい。

topographic_hillshading.py

航空写真にありがちな地形に陰影を付けてプロット?するデモコード。

  • LightSource にそのものズバリのメソッド hillshade がある。この戻り値を Axes.imshow に引き渡す。

  • exaggregate (v.): 「誇張する」の意。

statistics

統計データに相性の良いプロット各種のデモコード。

boxplot_color_demo.py

箱プロットのデモ。

  • ダミーデータは np.random.normal を利用して生成。正規分布。

  • メソッド Axes.boxplot によるプロット。

  • キーワード引数 notch を指定すると、箱の形状が V 字型にえぐれる。

boxplot_demo.py

箱プロットにさまざまなオプションおよび描画スタイルを適用するデモ。

  • ダミーデータは np.random.lognormal を利用して生成。正規分布。

  • サブプロットを複数作成して、それぞれでメソッド Axes.boxplot をさまざまなオプションと共に呼び出す。ここでは showmeans, showbox, meanline, showcaps, notch, bootstrap 等のキーワード引数を指定する。

  • 描画用の引数として boxprops, flierprops, medianprops がある。いずれも dict オブジェクトを渡す前提だ。

  • メソッド Figure.suptitle で中央寄せの見出しを図に付ける。

boxplot_vs_violin_demo.py

バイオリンプロットと箱プロットの比較デモ。

  • メソッド Axes.violinplot によるプロット。ここでは showmeans=False, showmedians=True としている。これは隣のサブプロットに描く箱プロットととの比較をしやすくしているのだろう。

  • バイオリンプロットの一つのデータの形状は、なるほどバイオリンのような輪郭だ。

bxp_demo.py

プロットデータ計算と描画を分けて実現するデモ?

  • デモコードの働きは二つ上のデモコードと同じ。

  • 関数 mpl.cbook.boxplot_stats でサンプルデータから統計データ?を計算しておく。

  • 次にメソッド Axes.bxp でこのデータの箱&ヒゲプロットを描画する。このメソッドの引数は Axes.boxplot とかなり共通している。

errorbars_and_boxes.py

メソッド Axes.errorbar のデモ。

  • このデモでは二次元のダミーデータを用いる。

  • 四角い部分の描画は PatchCollection オブジェクトによる。

errorbar_demo.py

関数 plt.errorbar の使い方を説明する基本的なデモ。

  • キーワード引数 xerryerr でそれぞれに対応する軸方向のアイビームの長さを指定する。

errorbar_demo_features.py

エラー部分の線を対称形にしたり非対称形にしたりするデモ。

  • 上のサブプロットはエラーを y 軸方向に、下のサブプロットは x 軸方向にそれぞれ表示する。

  • メソッド Axies.errorbar においてエラー量を指定する引数は xerr, yerr である。

  • 意味はないが、下のサブプロットでは y 軸を対数グラフにしている。 ax1.set_yscale('log') による。

errorbar_limits.py

エラー部分のさまざまなスタイル設定のデモ。

  • メソッド Axies.errorbar においてキーワード引数 uplims, lolims, xlolims, xuplims を用いる。

histogram_demo_cumulative.py

累積的ヒストグラムのデモ。

  • ヒストグラムをプロットする関数は plt.hist だ。この引数の cumulativeTrue を指定すれば累積的になるし、-1 を指定すれば逆累積ヒストグラムになる。

histogram_demo_features.py

別のページで説明したので省略。

histogram_demo_histtypes.py

ヒストグラムのデモ。

  • histtype='stepfilled' とするとビン同士の間の線がバーの色で塗りつぶされる。

  • 第 2 引数にビンの幅の list オブジェクトを渡すと、ビン間隔が非一様なヒストグラムが描ける。

histogram_demo_multihist.py

複数データを同一のサブプロットに描くデモ。

stacked=True としたり、データそのものが入れ子の配列だったりといろいろなパターンがある。

multiple_histograms_side_by_side.py

複数のヒストグラムを同一サブプロット内で一列に並べるデモ。

violinplot_demo.py

バイオリンプロットのデモ。

  • メソッド Axes.violinplot のキーワード引数 showmedians, showextrema, showmeans, bw_method のデモ。

style_sheets

モジュール mpl.pyplot.style の見本コード集。

plot_bmh.py

ヒストグラム重ねあわせ。

  • plt.style.use('bmh') を適用。これは Bayesian Methods for Hackers という書籍で用いられているテーマだそうだ。

  • 無意味なデータを生成するのに np.random.beta を利用。

plot_dark_background.py

プロットの背景を黒くするだけのデモ。

  • 単に plt.style.use('dark_background') するだけで実現できる。このとき、通常は黒塗りで描画される図表要素は白色で描画される。

plot_fivethirtyeight.py

特に変わったことはない?

  • plt.style.context('fivethirtyeight') を適用。この際に with ブロックを用いる。

plot_ggplot.py

サブプロット四個。

  • スタイルを R の一般的なパッケージである ggplot 風にするのに plt.style.use('ggplot') とする。

  • スクリプトの docstring の文言が笑える。いちおう許可は取ってあるのか。

  • 無意味なデータを生成するのに np.random.normalnp.random.randint を利用。

plot_grayscale.py

サブプロット二個でグレースケール。

  • plt.style.use('grayscale') でよい。

subplots_axes_and_figures

fahrenheit_celsius_scales.py

一つのサブプロットに二種類の目盛を割り当てる見本。

  • メソッド Axes.twinx でもう一つの Axes を生成する。これと元の Axes を使い分けて華氏と摂氏の目盛を左右の Y 軸に描画する。

  • メソッド Axes.callbacks.connect の呼び出しは何だろう。

subplot_demo.py

サブプロットを二個同一ウィンドウに描画する見本。

  • ここでは関数 plt.subplot(nrows, ncols, plot_number) 形式で呼び出す。オブジェクト指向的ではなく、状態機械的な手続きで各サブプロットの特性を操作する。

tests

backend_driver.py

見本ディレクトリー配下にあるかなりの数の見本スクリプトを、コマンドラインから指定されたバックエンドを用いて実行するためのスクリプトである。

IPython セッションからの実行例を次に示そう。途中で Ctrl + C して中断した。

In [1]: %run ./backend_driver.py -bqt5agg
 ..\pylab_examples files not tested: agg_buffer.py, agg_buffer_to_array.py, ...
 ..\api files not tested: compound_path.py, demo_affine_image.py, ...
 ..\units files not tested: artist_tests.py, bar_unit_demo.py, basic_units.py, ...
 ..\mplot3d files not tested: contour3d_demo3.py, contourf3d_demo2.py, ...
 testing qt5agg
      driving ..\pylab_examples\accented_text.py
 9.067790508270264 0
         driving ..\pylab_examples\alignment_test.py
 QObject::~QObject: Timers cannot be stopped from another thread
  • コマンドラインオプション -b でバックエンドを指定できる。

  • コマンドラインオプション -d でテスト対象とするサブディレクトリーを指定できる。ただし、一部のディレクトリーにはサンプルコードの漏れがあると思われる。

text_labels_and_annotations

autowrap_demo.py

関数 plt.text のデモ。

  • この関数のキーワード引数はクラス Text の特性と対応している。例えば、キーワード引数 wrap=True と指定することで、長いテキストを自動的に折り返してくれる。

rainbow_text.py

テキストの部分だけを着色するデモ。かなりの工夫をすることになるようだ。

  • mpl.transforms.offset_copy なる関数までも動員する。

text_demo_fontdict.py

テキストを入力とする Matplotlib の各種関数にはキーワード引数 fontdict があり、利用するフォントの各情報を dict オブジェクトに詰め込める。

unicode_demo.py

テキストを入力とする Matplotlib の各種関数は Unicode を当然のように受け付ける。

ticks_and_spines

spines_demo.py

Axes は既定で四辺すべてに枠線が引かれるが、これを辺ごとに設定できることを示すデモ。

  • 私の見たところ ax1.spines['top'].set_visible(False) が効いていない。

spines_demo_bounds.py

さらに辺の一部だけに枠線を引くこともできる。

  • ax.spines['left'].set_bounds(-1, 1) がそれを実現する。

spines_demo_dropped.py

Axes の枠線を既定の位置からオフセットするようにずらすやり方を示すデモ。

  • ax.spines['left'].set_position(('outward', 10)) のようにする。

  • プロット用ダミーデータとして乱数 np.random.uniform を利用。

ticklabels_demo_rotation.py

目盛のラベル文字を決めるデモ。

  • メソッド Axis.set_major_formatter 等を使う。さらにクラス FuncFormatter の利用と自作の書式設定関数の作成が必要となる。

  • メソッド Axis.set_major_locator で目盛ラベルの出現に制約をつける。

tick_labels_from_values.py

目盛のラベルを決めるデモ。

  • 関数 plt.xticks の二番目の引数として、ラベル文字列からなる list オブジェクトを引き渡すことで指定できる。

units

このディレクトリーの見本コード群はモジュール basic_units.py を定義しておき、それ以外のスクリプトがこれを import するという構造である。

basic_units.py

難しいコードだ。これを理解するのが本題だ。

  • 一般利用者が理解するという目的からすると、必要以上に複雑になっている可能性がある。

以下はこのモジュールを応用するデモコードだ。

annotate_with_units.py

距離単位オブジェクトの利用を除けば、注釈矢印のデモコード。一方の矢印は単位系を全て basic_units.cm で明示し、他方はラベル座標の単位系を無次元単位で指定しているというもの。

  • さらに両者の引数 textcoords の値が異なることに注意。前者は data つまり注釈されるオブジェクトの座標系が適用されるのに対して、後者は axes fraction つまりサブプロット領域の正規化座標系が適用される。

artist_tests.py

Line2D 等が座標変換を扱えることを示すデモコード。

  • メソッド Axis.set_unitsbasic_units.cm を引き渡す。

  • Line2D, Rectangle, Text それぞれについて、オブジェクトの位置や長さをやはり basic_units.cm を用いて指定する。

bar_demo2.py

同一データを座標軸ごとに単位系の異なる複数のサブプロットに描くデモコード。

  • 先頭に cms = cm * np.arange(0, 10, 2) というオブジェクトが現れる。これをいずれのサブプロットにおいても棒グラフで描く。

  • メソッド Axes.bar のキーワード引数 xunitsyunits について単位オブジェクト basic_units.cmbasic_units.inch を指定する。

bar_unit_demo.py

棒グラフだが、データは人間の身長の統計のようだ。

  • モデルデータに単位オブジェクトを含める。

  • サブプロットの y 軸にだけ Axis.set_unitsbasic_units.cm を引き渡す。

  • あとはメソッド Axes.autoscale_view が適宜調整してくれるようだ。

ellipse_with_units.py

同じ形状を定義した上で EllipseArc を比較する。

  • 中心、長径、短径のすべてを basic_units.cm で定義する。

  • サブプロットの座標系単位系は明示的に指定しない。

evans_test.py

このデモは basic_units.py を必要としない。

  • コードの前半はモジュール mpl.units にカスタム単位を登録する方法の見本だ。ユーザーがクラスを二個書く必要があるようだ。

  • コードの後半は単位のついたデータ量を、サブプロットに対しては直接単位系を指定せずにプロットする。

radian_demo.py

basic_units.radiansbasic_units.degrees のデモコード。

  • 二つサブプロットを用意しておき、メソッド Axes.plot のキーワード引数 xunits に一方は radians を、他方には degrees を指定してプロットする。その結果、座標軸の目盛ラベルがそれぞれ違って見える。

units_sample.py

basic_units.cmbasic_units.inch のデモコード。

  • サブプロットを四個用意して、それぞれのメソッド Axes.plot の呼び出しに対してキーワード引数 xunits および yunits に考えられる組み合わせで単位を指定する。

units_scatter.py

散布図の y 軸にだけカスタム単位を適用するデモコード。

  • サンプルデータの単位は basic_units.secs とする。

  • メソッド Axes.scatteryunitsbasic_units.secs とする。

  • 一番下のサブプロットだけメソッド Axis.set_units を呼び出して basic_units.herz を指定する。

  • NumPy から UserWarning: Warning: converting a masked element to nan. が生じるが、気にしないでおく。

user_interfaces

Matplotlib は wxPython, PyGTK, Tkinter, PyQt4/5 の GUI アプリケーションに直接埋め込むことができることを示すデモコードの集まり。ここでは私の環境で実行できたデモコードをコメントする。

embedding_in_gtk.py

要 GTK につき実行できない。

embedding_in_gtk2.py

要 GTK につき実行できない。

embedding_in_gtk3.py

要 GTK につき実行できない。

embedding_in_gtk3_panzoom.py

要 GTK につき実行できない。

embedding_in_qt4.py

クラス matplotlib.backends.backend_qt4agg.FigureCanvasQTAgg のサブクラス化のデモ。

  • PyQt4 だけでなく PyQt5 もインストールされている環境で実行すると RuntimeError: the PyQt4.QtCore and PyQt5.QtCore modules both wrap the QObject class という例外が発生する。

embedding_in_qt4_wtoolbar.py

クラス matplotlib.backends.backend_qt4agg.NavigationToolbar2QT のデモ。実行するとツールバーが下部に付いたウィンドウが表示される。

  • PyQt4 だけでなく PyQt5 もインストールされている環境で実行すると RuntimeError: the PyQt4.QtCore and PyQt5.QtCore modules both wrap the QObject class という例外が発生する。

  • 警告 MatplotlibDeprecationWarning: This module has been deprecated in 1.4 ... が出現する。

  • クラス FigureCanvasQTAgg をこのデモでも当然利用する。このオブジェクトの生成時に Figure オブジェクトを渡す。キャンバスは QVBoxLayout に渡す。

  • メソッド on_draw でいちいちサブプロットを生成、描画する。

  • キーイベントは on_key_press で処理する。ただしツールバー自体も処理したいようなので、そちらにもイベントを横流しする。例えば S を押すと、ファイル保存ダイアログボックスが現れる。

embedding_in_qt5.py

クラス matplotlib.backends.backend_qt5agg.FigureCanvasQTAgg のサブクラス化のデモ。

  • 最初のモジュールインポート文の感じが embedding_in_qt4.py と異なる。

  • サブクラスとして MyMplCanvas, MyStaticMplCanvas, MyDynamicMplCanvas を定義する。最初のクラスは残りのもののスーパークラスとする。ここで Matplotlib の FigureAxes オブジェクトを保持し、 Qt のウィンドウオブジェクトの設定を行う。

  • クラス MyStaticMplCanvas では単純な正弦波をプロットする。

  • クラス MyDynamicMplCanvas では Qt のタイマークラスを用いて折れ線プロットのアニメーションを実現する。

  • クラス ApplicationWindow は Qt アプリケーションでよく見られる QMainWindow のサブクラス。ウィンドウ部品を手動でレイアウトしたり、メニューアイテムを実装したりする。

  • 最後の数行は PyQt アプリケーションにありがちなメイン関数のコードだ。

embedding_in_tk.py

現在 Tk の DLL が壊れているのだろうか、Python ごと落ちる。

embedding_in_tk2.py

現在 Tk の DLL が壊れているのだろうか、Python ごと落ちる。

embedding_in_tk_canvas.py

現在 Tk の DLL が壊れているのだろうか、Python ごと落ちる。

embedding_in_wx2.py

要 wxPython 2.8.12 以上とのことなので実行できない。

embedding_in_wx3.py

要 wxPython 2.8.12 以上とのことなので実行できない。

embedding_in_wx4.py

要 wxPython 2.8.12 以上とのことなので実行できない。

embedding_in_wx5.py

要 wxPython 2.8.12 以上とのことなので実行できない。エラーメッセージが他のものと少々異なる。

embedding_webagg.py

簡単なプロットをブラウザーに表示し、いつものウィンドウでの簡単な操作に加え、各種フォーマットのファイルをダウンロードすることが可能なことを示すデモ。

  • 要 Tornado とのこと。実行してみたらファイアーウォールの解除も必要なことがわかる。

  • モジュール matplotlib.backends.backend_webagg_core からクラスと関数を import する。

  • クラス MyApplication をクラス tornado.web.Application のサブクラスとして定義する。ここは Tornado を学習しないことには何とも言えない。Matplotlib の Figure オブジェクトを関数 new_figure_manager_given_figure に渡す。このオブジェクト figure が HTML ファイルの対応する部分に埋め込まれる。

  • MyApplication のコンストラクターでクラス FigureManagerWebAgg のクラスメソッド get_static_file_path を用いる。

  • MyApplication の内部クラス WebSocket が明らかに重要そうなのだが、私にはコードの意味がはっきりとわからない。

  • スクリプト実行後に出力される URL をブラウザーに与えればプロットが現れる。

fourier_demo_wx.py

要 wxPython 2.8.12 以上とのことなので実行できない。

gtk_spreadsheet.py

要 GTK につき実行できない。エラーメッセージが他のものと少々異なる。

histogram_demo_canvasagg.py

無反応?

interactive.py

要 GTK につき実行できない。

interactive2.py

要 GTK につき実行できない。

lineprops_dialog_gtk.py

要 GTK につき実行できない。

mathtext_wx.py

要 wxPython 2.8.12 以上とのことなので実行できない。

mpl_with_glade.py

要 GTK につき実行できない。

mpl_with_glade_316.py

要 GTK につき実行できない。

pylab_with_gtk.py

要 GTK につき実行できない。

rec_edit_gtk_custom.py

要 GTK につき実行できない。

rec_edit_gtk_simple.py

要 GTK につき実行できない。

svg_histogram.py

SVG ファイルにヒストグラムを出力し、そこにある凡例の棒をクリックするとプロット上の対応する棒の表示状態が切り替わるというデモ。SVG ファイルに JavaScript を埋め込むので、動作確認にはそれなりのブラウザーが必要。

  • プロット部品に対してメソッド .set_gid を呼び出すことで SVG 要素用の ID を適宜割り振っていく。

  • 関数 plt.savefig にキーワード引数 format="svg" を指定することでファイル風オブジェクトにプロットの内容を SVG 形式で出力する。

  • 後半は Python 標準ライブラリーにあるクラス xml.etree.ElementTree の機能を利用。 SVG 要素としてのパッチ要素にイベントハンドラーを属性値として設定する。

  • JavaScript のコードテンプレートを here string で書いて(デモなので)実引数を与える。関数 json.dumps はこういう使い方もするのか。

  • 最後に ElementTree オブジェクトを生成して直ちにメソッド write を用いてSVG ファイルを保存する。

svg_tooltip.py

SVG ファイルに図形を含むプロットを出力し、そこにある図形の上にマウスポインターを重ねるとツールチップが出現するというデモ。デモ svg_histogram.py と共通するところが多い。

toolmanager.py

要 GTK につき実行できない。

wxcursor_demo.py

要 wxPython 2.8.12 以上とのことなので実行できない。

widgets

ウィンドウ部品のデモコード一式。GUI の学習はここから始めてよい。

buttons.py

プッシュボタンのデモ。ボタンを押すたびに波形の振動数が増減する。

  • ここでは関数 plt.axes をボタンを配置する空間を確保するものとして利用している。戻り値を Button コンストラクターの引数に使う。

  • メソッド Button.on_clicked に押された時に呼び出される振る舞いを指定する。

  • 関数 plt.draw でサブプロットを更新描画する。

check_buttons.py

チェックボックスのデモ。チェックボックスに対応する波形の表示が切り替わる。

  • スペース確保とイベントハンドラー周りのコードは前回同様。

  • クラス CheckButtons のコンストラクターには場所とラベルに加えて初期状態も指定する。

  • プロットオブジェクトには visible のような属性があって、これを関連メソッドで操作する。また、生成時にもキーワード引数で初期値を指示できる。

cursor.py

マウスカーソルの位置に追従してサブプロット上にクロスヘアを描くデモ。

  • AttributeError: Unknown property facecolor という例外が生じるので、これを引き起こすコードを削除しておく。

  • クラス Cursor のコンストラクターを適当に呼び出すだけでよい。

lasso_selector_demo.py

このデモは期待通りに動作しない。投げ縄選択で水玉を囲むデモだと思われる。

menu.py

メニューのデモ。

  • AttributeError: module 'matplotlib.colors' has no attribute 'to_rgba' 例外が生じる。これを解決するために、クラス colors.ColorConverter のオブジェクトを導入しておく。

  • コードがたいへん込み入っている。未知のクラスを相当利用したデモコードだ。

  • クラス MenuItemartist.Artist のサブクラスとしてここで実装している。それ以外のユーザー定義クラスは全てが object からのサブクラスだ。

  • イベントハンドラーの定義はメソッド fig.canvas.mpl_connect から行う。

multicursor.py

マウスカーソルの位置に追従して二つのサブプロット上に縦線を描くデモ。

  • クラス MultiCursor の最初の引数に fig.canvas を指定する。次の引数には対象のサブプロットを含む list または tuple を指定する。

radio_buttons.py

ラジオボタンのデモ。各項目に対応する波形の描画スタイルが切り替わる。

  • クラス RadioButtons を使うコードの構造は ButtonCheckButtons とよく似る。

  • AttributeError: Unknown property facecolor という例外が生じるので、これを引き起こすコードを削除しておく。

rectangle_selector.py

マウスによる矩形領域選択のデモ。

  • クラス RectangleSelector を用いる。

  • イベントハンドラーの指定がこれまでと異なる。まず RectangleSelector コンストラクターの引数に一個、次に関数 plt.connect を呼び出してもう一個、という感じだ。前者のハンドラーはマウス操作のコールバックとして、後者のハンドラーはキー操作のコールバックとして指定する。

slider_demo.py

SliderRadioButtons のデモ。

  • AttributeError: Unknown property facecolor という例外が生じるので、これを引き起こすコードを削除しておく。

  • クラス Slider の使い方はこれまでの widget と大体同じ。イベントハンドラーは on_changed となる。

span_selector.py

サブプロット上の横幅をマウスで選択するデモ。

  • クラス SpanSelector を用いる。

  • AttributeError: Unknown property facecolor という例外が生じるので、これを引き起こすコードを削除しておく。