グラフをもうちょっとマシにする

インタラクティブなグラフにする

jupyterlabそのままでは、グラフを扱う能力が貧弱なため、ipympl(別名jupyter-matplotlib)というパッケージを使います。このパッケージはすでにインストールが済んでいるはずです。

まず、jupyter上で、何か新しくnotebookを開いた直後に必ず最初に一度だけ

%matplotlib widget

を実行してください。これはipymplの機能を利用するためのマジックコマンドです。このコマンド実行以後に、グラフを作ると、グラフの拡大縮小や移動などをインタラクティブに行うことができます。

違うnotebookを開いたときには、やはり、そのnotebook上で、一度だけ上記のコマンドを実行してください。逆に、同じnotebook上で二度以上、上記のコマンドを実行してしまうと、それまでに描画したグラフはリセットされるので、注意しましょう。

また、notebook上の画像は、一度notebookを閉じると、リセットされてしまいます。重要なグラフは画像ファイルとして保存しておきましょう。特に計算時間がかかるような解析を行った場合は、リセットされてしまうと、同じ時間が必要になります。大変な事にならないよう、

  • 解析結果そのものをasciiやバイナリデータファイルとして保存しておく

  • グラフを画像ファイルとして保存しておく(ただし、グラフの見た目は必ずあとから修正したくなるものです。解析に時間がかかるのならばデータも保存しておいた方が賢明です)

といったことを心がけましょう。

デフォルトの見た目を変える

matplotlibで提供されるデフォルトのグラフの見た目は、あまりパットせず、論文や研究発表には使いにくい見た目をしています。実際、どのような形式が適切化は、用途・分野・文脈によって異なるものですが、逆にいえば、一人の人間が作業する限りは、「適切なグラフの見た目」というのは、あまり変わらないものです。グラフの見た目のうち、フォントのサイズやラベルの相対的な位置など、基本的なものは、最初に統一的な設定してしまいましょう。そのためにはrcParamasという変数の中身を調整していきます。例えばnotebookの最初で

%matplotlib widget
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
plt.rcParams['font.size'] = 16
plt.rcParams['xtick.major.pad'] = 8
plt.rcParams['ytick.major.pad'] = 8
plt.rcParams['figure.autolayout']= True
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
plt.rcParams['xtick.top'] = True
plt.rcParams['ytick.right'] = True

のように、デフォルトのグラフの見た目を設定してしまいましょう。これで、このノートブック中で作られるグラフはすべてこの設定が適用されます。5行目から順番に、

  • フォントサイズを16に指定

  • 横軸のラベルの相対位置調整

  • 縦軸のラベルの相対位置調整

  • 各グラフのラベルなどが重ならないように、各種パラメータを自動調整する

  • 横軸の目盛りを内向きにする

  • 縦軸の目盛りを内向きにする

  • 上にも目盛りを付ける

  • 右にも目盛りを付ける

ことに対応しています。

matplotlibのもともとのグラフの見た目と比べると

多少改善されたと思います。あとは、自分の好みや、よく論文投稿するジャーナルの要請に従って最適な見た目に予め調整しておきましょう。

グラフに関する細かいテクニック

グラフに関する、よく使いそうなテクニックをまとめました。必要に応じて参照してください。

特定の図の見た目のみ変更

すべての図について共通して見た目を変更する方法はすでに紹介しましたが、特定のグラフだけ見た目を変更することもできます。

例えばaxes領域にアクセスすることで

ax.set_xlabel("test (μs)", fontsize=20)

のようにx軸のラベルのフォントサイズを変更したり

ax.tick_params(axis='x', labelsize=8)

のようにx軸の目盛りの数字のフォントサイズを変更したりできます。たとえば

fig1, ax1 = plt.subplots()

curve1 = ax1.plot(t,x, marker='o',c='b')
ax1.set_xlabel("time (s)",fontsize=20)
ax1.set_ylabel("position (m)")
ax1.tick_params(axis='x', labelsize=8)

を一度に同じセル内で実行するというような使い方です。

数値でプロット範囲を指定

ax.set_xlim(0, 8)
ax.set_ylim(1,3)

のようにaxes領域にアクセスすることで、グラフの範囲を指定することができます。

高解像度の画像を作りたい

plt.subplots() のオプションdpiを使います。数値が大きいほど解像度が高いです。デフォルトでは100です。場合によりますが400もあれば十分でしょう。

fig, ax = plt.subplots(dpi=400) 

凡例(legend, ラベル)をつけたい

ax.plot実行時にオプションを付けておきます。

curve1 = ax.plot(xdata,my1Ddata,marker='o',c='b',label='label example')

その上で、

ax.legend(loc='upper left') # legend をupper leftに置きたいとき

と実行すると、

のように凡例が表示されます。

対数プロットしたい

上述のグラフを作るための基本的なコードを実行したあとで、

ax.set_yscale("log")

を実行すれば、片対数プロットができます。線形に戻したいときは

ax.set_yscale('linear')

と実行しましょう。

数式やギリシャ文字を使いたい

軸ラベルなどで、例えば

ax.set_xlabel(r"$\alpha$")

のようにr"$$"という表記を使うと$と$の間にlatexの表現を使うことができます。

最終更新