.. toctree:: ================== Matplotlibの使い方 ================== matplotlibは、データをプロットするためのライブラリです。データが大量に なってくると、数字を眺めていても何を意味しているのかわからないことがあ ります。実験やシミュレーションから出力される大量のデータを可視化するこ とで、データが示す意味を理解できるようになります。ビックデータを使った 新しい科学が注目を浴びているように、データの海から新しい価値を発掘 (data mining)するためにも可視化は重要です。 pythonから利用できる可視化用のライブラリは、データのタイプによっていく つかあります。2次元と3次元のデータをプロットするためのライブラリは、 matplotlibがもっとも普及しています。matplotlibは、2次元(:math:`x,y` の データセット) と3次元データ(:math:`x, y, z` のデータセット)を効率良く かつきれいに可視化することができます。matplotlib使った基本的な作図方法 を説明します。 https://matplotlib.org/ .. note:: 4次元データは、(例えば電子密度のような :math:`|\psi(x, y, z)^2|` のデータ)は、matplotlibでうまく表現できません。Mayavi等 (http://docs.enthought.com/mayavi/mayavi/) の可視化ライブラリを使う必要があります。 .. note:: 大学の計算機にインストールされているmatplotlibはversion 1.5.3です。 2018年1月現在、2.1.1が最新の安定versionです。1.5.x系から2.x系に version upすることで、デフォルトのスタイルが大きく変わっています。2.x 系で1.5.xと同じようなスタイルをプロットするためには、後述する plt.style.useで'classic'を指定します。 Matplotlibのインポート ====================== matplotlibは、非常に多くのモジュール群で (https://matplotlib.org/py-modindex.html)構成されています。一般的の2次 元プロットを利用するだでけは、トップレベルのmatplotlibをimportする必要 なく、可視化するためのmatplotlib.pyplotのimportだけで十分です。 .. code-block:: python import matplotlib.pyplot as plt # (慣習) プロットのスタイル ================== matplotlibは、デフォルトのプロットスタイルをスタイルシートという枠組み を使って好きに変えられます。デフォルトのスタイルを変更するためには、プ ログラムの先頭で以下のように定義します。 .. code-block:: python :caption: example-01 plt.style.use('classic') # 2.x系で1.5.x系のスタイルを使う 自分が使っているmatplotlibで利用できるスタイル一覧は plt.style.availableで得られます。 .. code-block:: python :caption: example-02 print(plt.style.available) 私のmacにインストールされているmatplotlib2.1.1の例です。 .. code-block:: python :caption: example-03 ['_classic_test', 'bmh', 'classic', 'dark_background', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark-palette', 'seaborn-dark', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'seaborn'] スタイルを指定するために、py.style.use()を使います。 .. code-block:: python :caption: example-04 plt.style.use('classic') 初期設定 ======== plt.style.use()で指定しない場合のデフォルトのスタイルは、環境設定ファ イルmatplotlibrcを使って指定することができます。自分用の環境設定ファイ ルを作っておけば、毎回設定する手間がはぶけて同じ体裁で作図することが可 能になります。matplotlibrcの配置場所は以下のとおりです。 * プログラムと同じ場所にあるmatplotlibrc * ユーザのホームディレクトリの.matbolot/.matplotlibrc 自分の * matplotlibがインストールされているmpl-data デフォルトを自分用のスタイルにしたい場合は、matplotlibがインストールさ れているmpl-dataの下のファイルをコピーして編集すれば良いでしょう。フォ ントのサイズや線幅等の細かい制御が可能になります。 matplotlibrcを変更を行わずに、プログラムの中からフォントサイズや線幅等 の変更を行うこともできます。 .. code-block:: python plt.rcParams.update({ 'legend.fontsize': 12, 'legend.numpoints': 1} 2次元プロット ============= .. _plot: :math:`x` と :math:`y` のリストを準備してplot()に渡せばプロットできます。 .. literalinclude:: plot.py :caption: example-05 numpyを使って関数プロットの方法について説明します。 .. literalinclude:: 2dplot.py :caption: example-06 次のようなプロットが表示されtest.pngが保存されます。データの後に、マー カーの種類や線種、色を指定しています。またlabelで凡例に表示する文字列 を指定指定しています。 .. image:: test.png :width: 400px :align: center .. note:: plt.plot(x, y)でプロットすることも可能ですが、「図」と「軸」のような オブジェクトを作成した方が、pythonらしいですし見通しが良いので、fig, とaxをplt.subplots()で作成しています。 棒グラフプロット ---------------- .. _barplot: barの位置と高さ、オプションで幅をbar()に渡せばbarプロットしてくれます。 barの位置は、barの'edge'か'center'のどちらか指定します。 .. literalinclude:: bar.py :caption: example-07 .. image:: bar.png :width: 400px :align: center 統計データは、ヒストグラムでプロットすると結果がわかりやすいです。デー タをpylab.histに渡すことでヒストグラムを作成できますが、numpyの histogramを使った方が自由にデータを処理ができるので、bins(区分)と hist(高さ)を計算してから、barでプロットすることとします。 https://matplotlib.org/devdocs/api/_as_gen/matplotlib.pyplot.bar.html 乱数て適当なデータを作ってプロットしています。 .. literalinclude:: histogram.py :caption: example-08 以下のような図が得られます。 .. image:: histogram.png :width: 400px :align: center np.histogra()は、hist(高さ)とbins(区分のエッジ)を返しますが、bins.size はhist.sizeの+1になります。 2軸でプロット ------------- x軸を共有した2系統のデータをプロットしたい場合、X(またはY)軸を共有した いオブジェクトをax.twinx()(またはax.twiny())で作成してプロットします。 .. literalinclude:: twinx.py :caption: example-09 以下のような図が得られます。 .. image:: twinx.png :width: 400px :align: center 複数の図をプロット ------------------ plt.subplots()でfigとaxを生成する際、nrows, ncolsを指定することで図中 に複数の軸を配置させることができます。nrowsとncolsで複数の軸を生成した 場合、axは2次元配列になっています。プロットしたい軸のaxにplot()します。 またfigオブジェクトを複数生成すれば、複数の図を表示させることもできま す。 https://matplotlib.org/devdocs/api/_as_gen/matplotlib.pyplot.subplots.html .. literalinclude:: subplots.py :caption: example-10 以下のような2つの図が得られます。 .. image:: subplots-1.png :width: 400px :align: center .. image:: subplots-2.png :width: 400px :align: center 3次元プロット ============= 3次元プロットは、3つのデータの組 :math:`(x, y, f(x,y))` を準備して可視 化します。データのパターンとして、 :math:`(x, y)` がグリッド(格子)上に 並ぶ場合と並んでいない場合の2パターンになります。 コンタープロット ---------------- xy平面上のグリッドの各点が値をもつようなデータのプロットによく用いられ ます。天気予報での気圧配置を思い浮かべると良いかと思います。100x50の格 子の場合、100x50の各格子点に対応する :math:`x`, :math:`y`, :math:`z` のデータを準備します。格子状のデータを作成するために、np.meshgrid()が 便利です。 https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.contour.html .. literalinclude:: contour.py :caption: example-11 下のような図が得られます。 .. image:: contour.png :width: 400px :align: center surfaceプロット ---------------- 軸を3つとってデータを可視化したい場合、Axes3Dモジュールをimportしてプ ロットします。コンピュータの画面や紙は2次元ですので、奥行きを表現する 必要があります。いろんな3Dプロットの方法があります。 https://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#mplot3d-tutorial ここでは1例として、球面調和関数の可視化に用いたsurfaceプロットだけ紹介 します。 https://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#surface-plots .. literalinclude:: surface.py :caption: example-12 下のような図が得られます。 .. image:: surface.png :width: 400px :align: center 数式・日本語フォント ==================== 数式はlatexの数式モードの表記に従って記述します。latexは、洗練された組 版システム(図表をリファレンス等を割り付けてくれる)で、数式の表現が豊富 で美しいため、学術論文の作成によく使われます。テキストベースで数学記号 ギリシャ文字と数学記号の入力は下のURLを参照してください。 https://matplotlib.org/users/mathtext.html#symbols いくつか例を上げます。括弧はペアで配置しないとエラーになります。分数は \frac{}{} で表記します。以下の数式をxlabelとylabelに割り付けてみます。 .. math:: &\alpha\int_0^{\infty} \exp\left( -\frac{x}{10} \right) &\sum_{i=1}^n x_i^2 日本語を表示させるためには、日本語用フォントを準備せねばなりません。OS のfont置き場にあるttfフォントを指定します。当然ですが、日本語のttfフォ ントでなれば日本語は表示できません。日本語を含むフリーのttfフォントを ダウンロードして利用していみます。 https://ipafont.ipa.go.jp/old/ipafont/download.html ipaexg.ttf(ゴシックフォント)をシステムのフォント置き場に移動します。 windowsの場合はC:\Windows\Fonts、macの場合は/LibraryFonts等です。後は Pythonのプログラムでフォントの名前をfont.familyにセットすれば日本語が 使えます。 .. literalinclude:: font.py :caption: example-13 .. image:: japanese-font.png :width: 400px :align: center