matplotlibの図中要素のフォントの設定

# 目的

* `matplotlib`で図を作成する時、デフォルトのフォントサイズが全般的に小さくてみにくい！
* `plt.plot`の各要素のフォントサイズを明示的に変更する方法を把握したい。

# matplotlibにおける二つの方式、`plt.plot`と`ax.plot`

* `plt.plot`と`ax`インスタンスを作成した上で`ax.plot`で描画する方法の二つがある。

* ここでは、`plt.plot`のmatlab式の方法ではなく、`fig, ax = plt.subplots()`でオブジェクト式の手法をお勧めしたい。

	* [こちら](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9)の、「matplotlibにはグラフを作る際に二つの流儀がある」という内容が大変詳しいので読むべきかと思うが、`matplotlib`には`plt.plot`をベースしたmatlab準拠の方法と、`ax.plot`をベースとしたオブジェクト指向の方法がある。

	* `plt.plot`は個別の要素に対する操作を包み込んだ命令を使用する一方、`ax.plot`の方式は、描画するfigureオブジェクト、その中のaxesオブジェクト…と階層的な構造を持つオブジェクト指向の方法。

	* `ax.plot`の方が面倒なように感じる。それは図の個別の要素に常に明示的なアクセスを要求するから。
	* このことはやりたいことを実現するための命令を調べないといけなかったり、インスタンスを作成したりする面倒さに起因すると個人的には思う。
	* しかし、その面倒さの原因である、「アクセスしたい要素への明示的な指定を強制される」、ということが、逆に以下のような長所に繋がると個人的には理解している。
	
		* アクセスする方法が分かれば最も直接的なコードの表現になり単純明瞭になる。
		* 自分のやりたいことが分からない時は、まずオブジェクトを調べればよく、そのオブジェクトも階層構造に整理されているので手掛かりが得やすい。
		* そして対象のオブジェクトが分かれば、そのプロパティ・メソッドなどからAPIなどで調べばよい。
		* つまりやりたいことの命令をあてどなく探し回らなくてよく、オブジェクトの枠組みの中で一歩ずつ順序立てて調べることができるようになり時間が節約できる。

	* `plt.plot`では全ての個別要素に対する操作ができるわけではない。図の作成のような細かい調整が必要になることが多い場合には、かゆい所に手が届かないこともある。
	
* ということで、最初から`ax.plot`方式に慣れておいた方がいいと思う。

# 方法

* x・y軸ラベル、軸の数値、グラフタイトルのフォントサイズなどの設定を行うサンプルを示す。

```python

import matplotlib.pyplot as plt

# オブジェクト指向的matplotlib
## figsizeやtight_layoutが指定できるので積極的に利用しよう
fig, ax = plt.subplots(figsize=(8,5),tight_layout=True)

# 描画
ax.plot([1,2,3],label='line_1')
ax.plot([4,5,6],label='line_2')

# xticklabels,yticklabelsを描画させるため
fig.show()

# 各要素で設定したい文字列の取得
xticklabels = ax.get_xticklabels()
yticklabels = ax.get_yticklabels()
xlabel = 'xaxis_name'
ylabel = 'yaxis_name'
title = 'タイトル'

# 各要素の設定をおこなうsetコマンド
ax.set_xticklabels(xticklabels,fontsize=18, rotation=45)
ax.set_yticklabels(yticklabels,fontsize=18)
ax.set_xlabel(xlabel,fontsize=22)
ax.set_ylabel(ylabel,fontsize=22)
ax.set_title(title,fontsize=30,fontname='IPAexGothic')

# legendはmatplotlib.text.Textのプロパティの設定ができない
ax.legend(loc='upper right',fontsize=18)
ax.grid()

plt.show()
```

* まず`ax.plot`などで図を書く。
* `fig.show()`で図を一度書き出す。

	* この理由は、`fig.show()`を実行していない状態だと、軸の数値を示す`xticklabels`および`yticklabels`のオブジェクトを取得する`get_xticklabels()`および`get_yticklabels()`に数値が入らないから。
	* ただ、`fig.show()`で一旦画像を書き出すことで表示されるようになるのだが…一瞬画面が映るのであまり気持ち良くない。
	* 画面に表示することなく内部的に画像を書き出すような命令があれば一瞬画像が表示される問題は解決すると思う。
	* しかしそれも現段階では分からなかったので、とりあえず`fig.show()`を実行するこの方法で我慢することにした。

* 設定したいx,y軸の数値、x軸・y軸ラベルやタイトルに設定する文字を変数に入れる。

	* `ax.get_xticklabels()`,`ax.get_yticklabels()`はx,y軸の数値文字列リストを取得できるのでこれを利用するのが便利。

* `set_`メソッドで文字列及びフォントなどの設定を行う。

	* 第一引数は、セットする文字列がデフォルトとして設定されている。

		* `label`キーワードで渡せば第一引数でなくてもいい。

	* x,y軸ラベル、グラフタイトルは通常の文字列を渡す。
	* 軸の目盛の文字を示す`xticklabels`および`yticklabels`は文字列のリストを渡す。
	* ここからが本題になるが、表示に関するプロパティを設定することができる。設定できる項目は[`matplotlib.text.Text`のプロパティ](https://matplotlib.org/api/text_api.html)が設定できる。以下によく使いそうなものを列挙する。

| オプション名 | 内容 |
|:-----------:|:----:|
|fontsize     |フォントの大きさ|
|fontname     |フォントの種類   |
|fontstyle    |'normal','italic','oblique'から選択|
|fontweight   |0-1000の数値で設定、もしくは' 'ultralight', 'light', 'normal', 'regular', 'book', 'medium', 'roman', 'semibold', 'demibold', 'demi', 'bold', 'heavy', 'extra bold', 'black'から選択|
|rotation     | 文字の回転角度を0-360度で設定。もしくは'horizontal'か'vertical'から選択|
![plot_test.png](https://qiita-image-store.s3.amazonaws.com/0/277647/58e272ec-9833-7a5b-9285-ad7da571a751.png)