見本コードを研究する¶
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まず色彩豊かな何かのアニメーションがあり、次に折れ線のアニメーションとなる。
FuncAnimationとArtistAnimationを別々に使用。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雨の降っている地面を眺めているかのようなアニメーション。
乱数は NumPy の
np.random.uniformを利用している。散布図 (
Axes.scatter) を応用している。
random_data.py区分的一次関数のアニメーション。区間以外が動的に変動する。
この中でもっとも単純なコードからなる。
乱数は NumPy の
np.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.pyAxesをサブクラス化して、独自の投影クラスを作成するデモ。応用。custom_scale_example.pyMercator 図法なプロットを自作するデモ。応用。
おおまかに言うと
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_transformにAffine2Dオブジェクトを指定する。このデモコードにはプロット表示処理がないので、お望みなら自分で書け。
donut_demo.py同心円の着色に関するデモ。だからドーナツ。
これは
PathとPathPatchのコンビで同心円を辺数の多い多角形で近似することで定義して、「穴」を塗ったり、または塗らないままにする方法を示している。
engineering_formatter.pyクラス
EngFormatterのデモ。対数グラフの座標軸ラベルのカスタマイズを示す。このデモでは
EngFormatter(unit='Hz', places=1)というオブジェクトを生成する。これにより、目盛ラベルは適当な所でHz,kHz,MHz, … という単位表示になる。数値は小数点以下一位まで見せる。ダミーデータの構成での NumPy の対数関係の関数の使い方が上手なので参考になる。
filled_step.py残念だが
AttributeError: Unknown property bottom_marginという例外が生じる。可能なら勝手に直したいところだ。font_family_rc.pyrcParamsの中身を直接変更することでフォントを指定するデモ。コードの一番最初で
rcParamsをimportする必要がある。それ以外の 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.pyLine2Dのサブクラスデモ。どのメソッドをオーバーライドすればよいかわかる。logo2.pyMatplotlib のロゴバナーを生成、表示するデモ。
デモというよりアートと呼びたい。
mathtext_asarray.pyクラス
MathTextParserのデモ。冒頭の関数
rc呼び出しが気になる。MathTextParserオブジェクトをコンストラクターで生成する。メソッド
.to_pngで指定した LaTeX の文字列を処理した結果を PNG ファイルに保存する。メソッド
.to_rgbaで指定した LaTeX の文字列を処理した結果をオブジェクトにする。メソッド
Figure.figimageでそれを描画する。呼び出し側が RGB 値を正規化する。
patch_collection.py主に
Wedgeパッチのデモコード。power_norm_demo.py2D ヒストグラムで
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_projectionにAxesのサブクラスの.nameを指定する。プロットデータの生成に
np.loadtxtを使っているのが面白い。メソッド
Axes.semilogyで y 軸が対数寸法になる。メソッド
Axes.axvlineは x 一定の線を引くものだが、このデモでは斜めになる。ScalarFormatterとMultipleLocatorの使用例も見られる。
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さらに複雑な複数サブプロットの配置方法のデモ。
最初のサブプロット群は田の字に配置するもの。クラス
ImageGridにFigureオブジェクトを渡す。次のサブプロット群も田の字だが、カラーバーをひとつ付属させる。横長カラーバーが田の字の上部に出る。
ImageGridコンストラクターの後半のキーワード引数がそれを指示する。次のサブプロット群も田の字だが、カラーバーがそれぞれに付属する。
ImageGridのcbar_mode="each"がポイントだ。最後のサブプロット群も田の字。カラーバーも個別。ただしカラーバーの範囲をサブプロットごとに変える。
demo_axes_grid2.pyImageGridのデモコード。最初のグループはサブプロットそれぞれにカラーバーを付属させる。
ImageGridの引数については以前のデモで理解できるだろう。デモコード定義の関数
add_inner_titleはサブプロット内にテキストを配置する。主にクラスAnchoredTextを利用するが、それ以外の機能はあまり馴染みがない。次のグループはサブプロットにひとつのカラーバーを共有させる。
ImageGridのcbar_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 値を分解するコードの処理内容が理解できない。謎のスライス。
クラス
RGBAxesでFigureからサブプロットを内部に 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のデモ。最初のグループではカラーバーを二個ずつ共有するデモ。下に付く。クラス
AxesGridをImageGridのように使うが、キーワード引数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.pyx 軸の目盛間隔が一様でないデモ?
先ほどの見本もそうだが、クラス
GridHelperCurveLinearの操作法が面倒そうだ。
demo_floating_axes.pyサブモジュール
mpl_toolkits.axisartist.floating_axesデモ。三個のサブプロットを生成する。サブプロット全体に affine 変換を施すことができる。それにはクラス
Affine2Dのオブジェクトを生成して適切な変換を定義しておく必要がある。それから別のオブジェクトに引き渡す。直交座標系の棒グラフでは
floating_axes.GridHelperCurveLinearとfloating_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.pyColormap Vega10 is not recognizedというエラーが出て完全には動作しない。動作するものについては、色見本が画面に描かれる。
color_cycle_default.py現在存在しない
set_facecolorへの参照があるコード。動作しない。color_cycle_demo.pyRGBY と 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マウスカーソルの移動処理のデモ。
FigureとAxesの両方について。イベント名は
(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.pyBé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.meanとnp.stdによる。ピックハンドラーの引数から得られる
event.indにはどうもプロット点列の配列としてのインデックス(複数)であるようだ。
pipong.py後述の
pong_gtk.pyがimportするモジュール。poly_editor.py正多角形の頂点をマウスでドラッグするデモ。
path_editor.pyのデモとコードの構造が同じ。Line2DやPolygonのキーワード引数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.pyMandelbrot 図形をズームインするデモ。
図形の生成コードは
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.pyAxes.pcolormeshとAxes.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.pyPython の
multiprocessing.Processとmultiprocessing.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.pyImportError: No module named 'traits'となってダメ。rec_groupby_demo.pyAttributeError: module 'numpy' has no attribute 'string0'となってダメ。rec_join_demo.pyAttributeError: module 'numpy' has no attribute 'string0'となってダメ。sample_data_demo.pyウィンドウに Lovelace 伯爵夫人の画像を表示する見本コード。
関数
mpl.cbook.get_sample_dataのデモコード。あとはplt.imreadとplt.imshowを呼び出す。
svg_filter_line.pyプロットを SVG データ化し、かつ XML コードをそこへ追加するようなデモコード。
関数
plt.savefigをBytesIOオブジェクトに対して作用させているのがポイント。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プロット空間内にプロット曲線と散布図を描くデモ。基本。
明示的な
import文from 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.contourをzdirを各座標成分ごとに呼び出すことで、等高線プロットを各座標平面に射影する。このときキーワード引数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.py3D 棒グラフのデモコード。基本。
関数
np.histogram2dでヒストグラムデータを作成する。さらに 16 本の棒の位置を決める配列を
np.meshgdi等で決める。メソッド
Axes.bar3dで棒グラフを描画する。注目したいのはキーワード引数zsort='average'で、この影響でビューをグリグリ回転させると、ある棒の辺と隣の棒の面との前後関係の描画が乱れることがある。
lines3d_demo.py3D 曲線のデモコード。基本。
メソッド
Axes.plotに三次元分の点列を渡す。
lorenz_attractor.pyLorenz 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.textとAxes.text2Dとがある。キーワード引数
zdirにはベクトルを表す配列を渡すこともできる。
tricontour3d_demo.pyTriangulationおよびplt.tricontourのデモコード。曲面 tessellation による描画。3D CAD でよく見かける手法に似ている。ある円周からクラス
Triangulationを利用して三角形格子を得る。オブジェクトtriang.trianglesは点列の添字三つ組の配列である。メソッド
Triangulation.set_maskで要らない三角形を指定?関数
plt.tricontourで tessellation をプロットする。ここでTriangulationオブジェクトと点列の z 成分配列を指定する。
tricontourf3d_demo.pyTriangulationおよびplt.tricontourfのデモコード。上のと同じ。trisurf3d_demo.pyAxes.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ワイヤーフレーム曲面デモ。基本。
曲面プロット系メソッドのキーワード引数
rstrideやcstrideにゼロを指定すると、曲面上の 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.pyMatplotlib の各種図表要素 (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.pyHinton 図のデモコード。白と黒でさまざまな大きさの正方形を格子上に描画する。
これは面白いから 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の使い方を説明する基本的なデモ。キーワード引数
xerrとyerrでそれぞれに対応する軸方向のアイビームの長さを指定する。
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だ。この引数のcumulativeにTrueを指定すれば累積的になるし、-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.normalとnp.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.pyAxesは既定で四辺すべてに枠線が引かれるが、これを辺ごとに設定できることを示すデモ。私の見たところ
ax1.spines['top'].set_visible(False)が効いていない。
spines_demo_bounds.pyさらに辺の一部だけに枠線を引くこともできる。
ax.spines['left'].set_bounds(-1, 1)がそれを実現する。
spines_demo_dropped.pyAxesの枠線を既定の位置からオフセットするようにずらすやり方を示すデモ。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.pyLine2D等が座標変換を扱えることを示すデモコード。メソッド
Axis.set_unitsにbasic_units.cmを引き渡す。Line2D,Rectangle,Textそれぞれについて、オブジェクトの位置や長さをやはりbasic_units.cmを用いて指定する。
bar_demo2.py同一データを座標軸ごとに単位系の異なる複数のサブプロットに描くデモコード。
先頭に
cms = cm * np.arange(0, 10, 2)というオブジェクトが現れる。これをいずれのサブプロットにおいても棒グラフで描く。メソッド
Axes.barのキーワード引数xunitsとyunitsについて単位オブジェクトbasic_units.cmやbasic_units.inchを指定する。
bar_unit_demo.py棒グラフだが、データは人間の身長の統計のようだ。
モデルデータに単位オブジェクトを含める。
サブプロットの y 軸にだけ
Axis.set_unitsにbasic_units.cmを引き渡す。あとはメソッド
Axes.autoscale_viewが適宜調整してくれるようだ。
ellipse_with_units.py同じ形状を定義した上で
EllipseとArcを比較する。中心、長径、短径のすべてを
basic_units.cmで定義する。サブプロットの座標系単位系は明示的に指定しない。
evans_test.pyこのデモは
basic_units.pyを必要としない。コードの前半はモジュール
mpl.unitsにカスタム単位を登録する方法の見本だ。ユーザーがクラスを二個書く必要があるようだ。コードの後半は単位のついたデータ量を、サブプロットに対しては直接単位系を指定せずにプロットする。
radian_demo.pybasic_units.radiansとbasic_units.degreesのデモコード。二つサブプロットを用意しておき、メソッド
Axes.plotのキーワード引数xunitsに一方はradiansを、他方にはdegreesを指定してプロットする。その結果、座標軸の目盛ラベルがそれぞれ違って見える。
units_sample.pybasic_units.cmとbasic_units.inchのデモコード。サブプロットを四個用意して、それぞれのメソッド
Axes.plotの呼び出しに対してキーワード引数xunitsおよびyunitsに考えられる組み合わせで単位を指定する。
units_scatter.py散布図の y 軸にだけカスタム単位を適用するデモコード。
サンプルデータの単位は
basic_units.secsとする。メソッド
Axes.scatterのyunitsはbasic_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 のFigureやAxesオブジェクトを保持し、 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.pySVG ファイルにヒストグラムを出力し、そこにある凡例の棒をクリックするとプロット上の対応する棒の表示状態が切り替わるというデモ。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.pySVG ファイルに図形を含むプロットを出力し、そこにある図形の上にマウスポインターを重ねるとツールチップが出現するというデモ。デモ
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のオブジェクトを導入しておく。コードがたいへん込み入っている。未知のクラスを相当利用したデモコードだ。
クラス
MenuItemをartist.Artistのサブクラスとしてここで実装している。それ以外のユーザー定義クラスは全てがobjectからのサブクラスだ。イベントハンドラーの定義はメソッド
fig.canvas.mpl_connectから行う。
multicursor.pyマウスカーソルの位置に追従して二つのサブプロット上に縦線を描くデモ。
クラス
MultiCursorの最初の引数にfig.canvasを指定する。次の引数には対象のサブプロットを含むlistまたはtupleを指定する。
radio_buttons.pyラジオボタンのデモ。各項目に対応する波形の描画スタイルが切り替わる。
クラス
RadioButtonsを使うコードの構造はButtonやCheckButtonsとよく似る。AttributeError: Unknown property facecolorという例外が生じるので、これを引き起こすコードを削除しておく。
rectangle_selector.pyマウスによる矩形領域選択のデモ。
クラス
RectangleSelectorを用いる。イベントハンドラーの指定がこれまでと異なる。まず
RectangleSelectorコンストラクターの引数に一個、次に関数plt.connectを呼び出してもう一個、という感じだ。前者のハンドラーはマウス操作のコールバックとして、後者のハンドラーはキー操作のコールバックとして指定する。
slider_demo.pySliderとRadioButtonsのデモ。AttributeError: Unknown property facecolorという例外が生じるので、これを引き起こすコードを削除しておく。クラス
Sliderの使い方はこれまでの widget と大体同じ。イベントハンドラーはon_changedとなる。
span_selector.pyサブプロット上の横幅をマウスで選択するデモ。
クラス
SpanSelectorを用いる。AttributeError: Unknown property facecolorという例外が生じるので、これを引き起こすコードを削除しておく。