【Matplotlib応用】グラフの高度な書き方♬

今回は、どうしてもよく理解しないとグラフが面倒ということで、Matplotlibを使ったグラフの書き方をまとめます。
【参考】
①[matplotlib.pyplot.subplots](https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.subplots.html)
②[Scatter plot on polar axis](https://matplotlib.org/3.1.0/gallery/pie_and_polar_charts/polar_scatter.html)
内容は、参考の①の付属の例を動かしただけですが、現実にグラフを書くときは、少し工夫が必要だということを書きたいと思います。
###やったこと
・まずとりあえず参考①の例を動かす（省略）
・最初の例から解説とその後の工夫を解説する
###・最初の例から解説する
必要なLibは以下のとおり

```py
import matplotlib.pyplot as plt
import numpy as np
```
まず、xとyを定義、特にnp.linspaceの第一引数は初期値、第二引数は最大値、そして第三引数は分割数。
ちなみに、デフォルトでは第二引数の値も結果に含むが、以下のように引数endpoint=Falseとすると、最大値$\ 2\pi\  $が含まれない。
`x = np.linspace(0,2*np.pi,400,endopoint=False)`

```py
# First create some toy data:
x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)
```
以下で通常のグラフを表示する。
この定義だと４象限にグラフを４個記載できるが、ここではax[0,0]として、第二象限に通常のグラフを描画する。

```py
# Creates just a figure and only one subplot
fig, ax = plt.subplots(2,2,figsize=(16, 8))
ax[0,0].plot(x, y)
ax[0,0].set_title('Simple plot')
```
![Figure_1_simple_plot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/90f95858-6aed-67d4-e16c-71b84f6b32e7.png)
###工夫の一つ目
描画位置を指定して描画できればよいが、個数が不明な場合などはそういうこともできないことがある。
ということで、単に順番に綺麗に並べたいとき以下のようにすると実現できる。

```py
# Creates just a figure and only one subplot
_, ax = plt.subplots(4)
plt.close()
fig=plt.figure(figsize=(16, 8))
ax[0]=fig.add_subplot(2,2,1)
ax[0].plot(x, y)
ax[0].set_title('Simple plot')
```
上記を動かすと以下のようなグラフが描画できる。
上記では、もとのfigは宣言したあとすぐに消去してaxの宣言だけを利用している。
しかも描画位置はadd_subplot(2,2,1)のように再度指定している。
![Figure_2_simple_graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/809d95fc-59d3-3c7c-4e8a-f6bdd788f5b5.png)
次は、通常のｙ軸シェアなplt.subplotsの例です。

```py
# Creates two subplots and unpacks the output array immediately
f, (ax1, ax2) = plt.subplots(1, 2, sharey=True,figsize=(16, 8))
ax1.plot(x, y)
ax1.set_title('Sharing Y axis')
ax2.scatter(x, y)
```
![Figure_3_shareY.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/21f4e845-8332-983e-73a4-8b8e0dacda4d.png)

###通常の極座標のグラフを４つの象限に配置する書き方

```py
# Creates four polar axes, and accesses them through the returned array
fig, axes = plt.subplots(2, 2, subplot_kw=dict(polar=True),figsize=(16, 8))
axes[0, 0].plot(x, y)
axes[1, 1].scatter(x, y)
```
###工夫の一品
これはいろいろなグラフを象限に配置するときに使えると思います。

```py
# Creates four polar axes, and accesses them through the returned array
fig = plt.figure(figsize=(16, 8))
axes0 = fig.add_subplot(221, projection='polar')
axes0.plot(x, y)
axes0.set_title('Simple plot')
axes1=fig.add_subplot(222)
axes1.scatter(x, y)
axes2=fig.add_subplot(223)
axes2.plot(x, y)
axes3 = fig.add_subplot(224, projection='polar')
axes3.scatter(x, y)
```
![Figure_4_2polar2graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/82af2b8e-469e-ba44-edbc-e48ef694061b.png)
###軸の配置と座標シェアのやり方
```py
# Share a X axis with each column of subplots
plt.subplots(2, 2, sharex='col')

# Share a Y axis with each row of subplots
plt.subplots(2, 2, sharey='row')

# Share both X and Y axes with all subplots
plt.subplots(2, 2, sharex='all', sharey='all')

# Note that this is the same as
plt.subplots(2, 2, sharex=True, sharey=True)

# Creates figure number 10 with a single subplot
# and clears it if it already exists.
fig, ax=plt.subplots(num=10, clear=True)
```
###複雑な配置のやり方
全て、参考③のものを再掲しています。
【参考】
③[In Matplotlib, what does the argument mean in fig.add_subplot(111)?
](https://stackoverflow.com/questions/3584805/in-matplotlib-what-does-the-argument-mean-in-fig-add-subplot111)
以下は、上記と同じ絵が描けますが、配置が記してあるので参考に掲載します。

```py
fig = plt.figure()
fig.add_subplot(221)   #top left
fig.add_subplot(222)   #top right
fig.add_subplot(223)   #bottom left
fig.add_subplot(224)   #bottom right 
```
次は、以下のようにアンバランスな面白い配置を取れます。

```py
fig = plt.figure()
fig.add_subplot(1, 2, 1)   #top and bottom left
fig.add_subplot(2, 2, 2)   #top right
fig.add_subplot(2, 2, 4)   #bottom right 
```
![Figure_1_graph2&1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/727d9d7b-6106-67a0-c912-c9302f4e126b.png)
そして、さらに数が増えてアンバランスな配置を取れます。

```py
plt.figure(figsize=(8,8))
plt.subplot(3,2,1)
plt.subplot(3,2,3)
plt.subplot(3,2,5)
plt.subplot(2,2,2)
plt.subplot(2,2,4)
```
![Figure_1_graph2&3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/af9e1d47-8852-5c48-f6b3-1374ed2fd917.png)

配置については、最後に先日のウワンの記事では自由な配置を紹介しているので、参考にしてください。
・[【matplotlib応用】グラフのもう一つの配置方法をやってみる♬](https://qiita.com/MuAuan/items/e69251066486b7ba04c4)
###まとめ
・Matplotlibでグラフ描画の応用編をまとめた
・plt.figureの使い方、plt.subplot、そして配列の使い方を学んだ