AIって結局何なのかよく分からないので、とりあえず100日間勉強してみた Day6
経緯についてはこちらをご参照ください。
■本日の進捗
●Matplotlib User Guideを修了
■Matplotlibとは何か
「Pythonではじめる機械学習」によると下記のように紹介されている。
“matplotlibは、最も広く使われているPythonの科学技術計算向けのグラフ描画ライブラリだ。出版にも使える品質のデータ可視化を実現する関数群を提供する。折れ線グラフ、ヒストグラム、散布図などさまざまな可視化方法がサポートされている。”
Andreas C. Muller, Sarah Guido. Pythonではじめる機械学習. 中田 秀基 訳. オライリー・ジャパン. 2017. 392p.
■なぜMatplotlibなのか
Matplotlibは他のMatplotlibベースのツール等に比べてコードが若干複雑になりやすく、(静的なグラフ描画を主眼にしているので)インタラクティブ性も高くなく、大規模データに対する実行速度も比較的早くない。
ではMatplotlibは何がいいのか?
それは圧倒的に高度なカスタマイズ性である。他のライブラリでは難しい学術的な描画やプロット内のほとんどの要素を細かくカスタマイズすることができる。
そして深い歴史(2003年リリース)によって成熟したユーザーコミュニティと信頼性がある。オープンソースであり、他のPythonライブラリとも連携されており、もはやPythonにおける可視化ツールのデファクトスタンダードといっても誰も反論できないまでの地位を確立している。
■Quick start guide
クイックに始めたいのでQuick start guideに取り組んでいく。
●figureの表示
>>> fig = plt.figure()
>>> fig, ax = plt.subplots()
>>> fig, axs = plt.subplots(2, 2)
>>> fig, axs = plt.subplot_mosaic([['left', 'right_top'], ['left', 'right_bottom']])
>>>
>>> plt.show()
User Guide通りにfigureを作成していくと、plt.show()を一度だけ実行しただけで下記のように複数のfigureが表示された。
これは各figureがそれぞれ保存されていて、すべてを呼び出しているからであると思われる。
>>> plt.close()
>>> fig, axs = plt.subplot_mosaic([['left', 'right_top'], ['left', 'right_bottom']])
>>> plt.show()
一度、plt.close()で閉じてから表示させると、その間に作成されたfigureのみが表示されるようになった。
●主要要素に関する用語
AxesとAxisとArtistについて
(ちなみにAxesはAxisの複数形、構成要素の半分が落ちるとは潔い単語ですね)
Axesは実際にデータを描画する領域で、タイトル(set_title())や軸ラベル(set_xlabel(), set_ylabel())などのメソッドがある
Axisはスケールや目盛り(set_xlim(), set_ylim())などを調整できる
ArtistはFigure 上で視覚的に表示される(Figure, Axes, Axisを含む)すべてのオブジェクトの総称
●プロットの基本
まずnp.matrixでNumPyの2次元マトリックスbを用意する。
これをnp.asarrayでNumPy配列に変換する。(matrixの使用は推奨されない)
>>> b = np.matrix([[1, 2], [3, 4]])
>>> b_asarray = np.asarray(b)
>>>
乱数シードを設定したら、aに整数配列を、c, dにランダム配列を格納していく。
>>> np.random.seed(19680801)
>>> data = {'a': np.arange(50),
... 'c': np.random.randint(0, 50, 50),
... 'd': np.random.randn(50)}
>>> data['b'] = data['a'] + 10 * np.random.randn(50)
>>> data['d'] = np.abs(data['d']) * 100
>>>
ここからが本題で、引数figsizeで5×2.7inchの領域を作成し、Figure内にプロットが収まるように自動調整する。(layout=’constrained’)
ax.scatterで散布させたら、x軸とy軸のラベルを設定して描画を開始する。
>>> fix, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
>>> ax.scatter('a', 'b', c='c', s='d', data=data)
<matplotlib.collections.PathCollection object at 0x000001D2589D9670>
>>> ax.set_xlabel('entry a')
Text(0.5, 0, 'entry a')
>>> ax.set_ylabel('entry b')
Text(0, 0.5, 'entry b')
>>>
>>> plt.show()
●コーディングスタイル
Matplotlibには2通りのcoding-stylesがあるらしい。
詳細はリンク先を参照していただきたいが、主な違いは明示的にfigureとaxesを生成するかどうかっぽい。要はオブジェクトを作成してからそれに対してメソッドを呼び出すオブジェクト指向スタイルか、オブジェクトを明示せずに簡潔に記述できるpyplotスタイルが選べるということ。どちらでも良いのだと思うが、オブジェクト指向スタイル(OOスタイル:まるではなくオー、Object-oriented)の方が柔軟なレイアウトができる他、オブジェクトを再利用できる点が良いのだと思う。
※ GUIに埋め込む場合にはオブジェクトを作成して埋め込むことになるため、その場で生成しないといけないpyplotは一切に使えないようなので注意。
●アンパックについて
例えば下記のコード、
>>> line, = ax.plot(t, s, lw=2)
lineの後にあるカンマはアンパックと呼ばれる必須の操作らしい。
ax.plot()は複数の要素から成るオブジェクトを返す関数だが、ここでは1つの要素(ラインオブジェクト)を渡そうとしている。このカンマがあることで、ax.plot()が返す要素の中の1番目の要素をlineに割り当てるという明示になる。もしこれを行わないと返り値となるオブジェクト全体がlineに渡されてしまい本来欲しいオブジェクトにアクセスできなくなってしまう。そのような場合には
line[0]
と明示すれば取り出せるようにはなるが、line変数自体は最初のコードの場合と同じものにはならない。
●カラーマップ
- pcolormesh
vminとvmaxでカラーマップの最大値と最小値を設定、cmapにレッドブル…じゃなくてレッドからブルーの反転を設定。
>>> pc = axs[0, 0].pcolormesh(X, Y, Z, vmin=-1, vmax=1, cmap='RdBu_r')
- contourf
等高線を11段階で設定。
>>> co = axs[0, 1].contourf(X, Y, Z, levels=np.linspace(-1.25, 1.25, 11))
- imshow
imshowで2Dデータを表示。カラーマップはPlasma。
>>> pc = axs[1, 0].imshow(Z**2 * 100, cmap='plasma', norm=LogNorm(vmin=0.01, vmax=100))
- scatter
c値でカラーをマッピング。
>>> pc = axs[1, 1].scatter(data1, data2, c=data3, cmap='RdBu_r')
■おわりに
Matplotlib User Guideは引くほど充実していました。cheatsheetsとかいう究極に便利なものがあったり、(かなり古いが)動画コンテンツまで用意されていました。おかげ様でほとんど引っかかることなく読了できました。
明日は予定通りSciPyに取り組んで、いよいよscikit-learnに入っていきたいと思います。
ちなみにNumPy, pandas, matplotlibを使ってみて、高いと思っていたExcelのライセンスキーが2万円する理由が何となく分かりました笑
Excelはデータ量が大きくなると一気に使いづらくなりますが、カジュアルな使い方なら本当に便利ですよね。
■参考文献
- Andreas C. Muller, Sarah Guido. Pythonではじめる機械学習. 中田 秀基 訳. オライリー・ジャパン. 2017. 392p.
- Matplotlib user guide – Matplotlib 3.9.2 documentation. matplotlib.org. 2024. https://matplotlib.org/stable/users/index.html
- ChatGPT. 4o mini. OpenAI. 2024. https://chatgpt.com/