matplotlibの基本的なグラフ設定を列挙〜散布図と連続曲線〜

# はじめに
pythonでグラフを作成するときの定番は`matplotlib`ですが、設定項目が多いのでいちいち調べて使うのは大変です。
基本の使用方法を列挙して、すぐに使えるようにしておこうと思います。

# 参考
- https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html
- http://ailaby.com/plot_marker/
- http://bicycle1885.hatenablog.com/entry/2014/02/14/023734
- http://ailaby.com/subplots_adjust/
- https://qiita.com/ponnhide/items/2b6279324ae792523020
- https://qiita.com/termoshtt/items/f6d6ee7a1f93175870e4

# 環境
- Google colab
- matplotlib==3.0.2

# 手順
### 散布図
まずは基本の散布図。

```python
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) #　シード値の固定

x = np.random.randn(100)
y = np.sin(x) + np.random.randn(100)

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, 'o', label='first')
  # これはplt.plot(x, y, marker='o', label='first', linestyle='')と同じ。

plt.title('title') # タイトル
plt.xlabel('x-axis label') # x軸のラベル
plt.ylabel('y-axis label') # y軸のラベル

plt.grid(True) # gridの表示
plt.legend() # 凡例の表示
```
<img width="256" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211712/12c4cfd0-cd45-c29f-49f4-7b01530eb03a.png">

`plt.plot(x, y, marker='o', label='first', linestyle='')`は、線を引かずに、各点のマーカーのみ表示するという意味になります。

### 軸のアスペクト比を1:1にする

`plt.axis('equal') `で軸のアスペクト比を1:1にできます。その他座標軸の設定は[matplotlibで座標軸を調整する](https://qiita.com/termoshtt/items/f6d6ee7a1f93175870e4)にあります。

```python
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) #　シード値の固定

x = np.random.randn(100)
y = np.sin(x) + np.random.randn(100)

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, 'o', label='first')
# plt.plot(x, y, marker='o', label='first', linestyle='')

plt.title('title') # タイトル
plt.xlabel('x-axis label') # x軸のラベル
plt.ylabel('y-axis label') # y軸のラベル

plt.grid(True) # gridの表示
plt.legend() # 凡例の表示
plt.axis('equal') # x軸とy軸の比を等しくする
```
<img width="251" alt="キャプチャ14.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211712/bd326628-68b8-c9dd-7ffa-c73e2804b535.png">



### 軸の範囲、最小単位、軸の文字サイズ、軸のラベルサイズを変更
軸の範囲は`plt.xlim`、`plt.ylim`、最小単位は`plt.xticks`、`plt.yticks`、文字を表示するものは大体引数に`fontsize`があります。

```python
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) #　シード値の固定

x = np.random.randn(100)
y = np.sin(x) + np.random.randn(100)

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, 'o', label='first')
  # これはplt.plot(x, y, marker='o', label='first', linestyle='')と同じ。

plt.title('title', fontsize=20) # タイトル
plt.xlabel('x-axis label', fontsize=15) # x軸のラベル
plt.ylabel('y-axis label', fontsize=15) # y軸のラベル
plt.xlim([-10,10]) # x軸の範囲
plt.ylim([-10,10]) # y軸の範囲
plt.xticks(np.arange(-10, 11, 1), fontsize=7) # x軸の最小単位
plt.yticks(np.arange(-10, 11, 1), fontsize=7) # y軸の最小単位

plt.grid(True) # gridの表示
plt.legend() # 凡例の表示
```
<img width="264" alt="キャプチャ9.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211712/b11d2159-3c66-9d7f-c9e0-8d9a88a784ed.png">

### 軸をlogスケールにする
`xscale`、`yscale`で軸のスケールを変えられます。

```python
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) #　シード値の固定

x = np.random.randn(100)
y = np.exp(x) + np.random.randn(100)

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, 'o', label='first')
  # これはplt.plot(x, y, marker='o', label='first', linestyle='')と同じ。

plt.title('title') # タイトル
plt.xlabel('x-axis label') # x軸のラベル
plt.ylabel('y-axis label') # y軸のラベル
plt.yscale('log') # y軸のスケールをlogにする

plt.grid(True) # gridの表示
plt.legend() # 凡例の表示
```
<img width="260" alt="キャプチャ10.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211712/b46ae3ba-8c99-2efb-fe25-9a9293090cba.png">


### グラフを重ねる
複数グラフを重ねるときは`plt.plot()`を複数にします。

```python
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) #　シード値の固定

x = np.random.randn(100)
y = np.sin(x) + np.random.randn(100)

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, 'o', label='first') 
plt.plot(x, x+y, 'o', label='second') 

plt.title('title') # タイトル
plt.xlabel('x-axis label') # x軸のラベル
plt.ylabel('y-axis label') # y軸のラベル

plt.grid(True) # gridの表示
plt.legend()
```
<img width="250" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211712/4256b791-b128-ded4-e594-ce2c9989ff71.png">

### 透過と色
`alpha`で透過度を、`color`で色を指定できます。

```python
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) #　シード値の固定

x = np.random.randn(100)
y = np.sin(x) + np.random.randn(100)

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, 'o', label='first', alpha=0.2, color='r')

plt.title('title') # タイトル
plt.xlabel('x-axis label') # x軸のラベル
plt.ylabel('y-axis label') # y軸のラベル


plt.grid(True) # gridの表示
plt.legend()
```
<img width="257" alt="キャプチャ3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211712/eadc7d11-cb61-dd04-1cac-f81fce801028.png">

色の指定は次の通りです。

|character|	color|
|:---:|:---:|
|'b'|	blue|
|'g'|	green|
|'r'|	red|
|'c'|	cyan|
|'m'|	magenta|
|'y'|	yellow|
|'k'|	black|
|'w'|	white|

### 連続曲線
linestyleを指定すると線の形状を変えられます。

```python
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) #　シード値の固定

x = np.linspace(0, 10, 100)
y = np.sin(x) 

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, '-', label='first')
# plt.plot(x, y, label='first', linestyle='-') # でも同じ

plt.title('title') # タイトル
plt.xlabel('x-axis label') # x軸のラベル
plt.ylabel('y-axis label') # y軸のラベル

plt.grid(True) # gridの表示
plt.legend()
```
<img width="272" alt="キャプチャ4.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211712/6b8f8af4-5e87-30f0-7b37-ec4928a2f1f0.png">

第3引数は`linestyle`と`marker`を勝手に判別してくれるようです。

```python
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) #　シード値の固定

x = np.linspace(0, 10, 100)
y = np.sin(x) 

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, '-o', label='first') 
# plt.plot(x, y, marker='o', label='first', linestyle='-') # でも同じ

plt.title('title') # タイトル
plt.xlabel('x-axis label') # x軸のラベル
plt.ylabel('y-axis label') # y軸のラベル

plt.grid(True) # gridの表示
plt.legend(['new label'], loc='lower right')
```
<img width="268" alt="キャプチャ5.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211712/373bf9f9-cc01-1c46-9c3f-bfece784be84.png">


`plt.legend()`に配列を渡すとラベルを変えられます。`loc`で表示位置を決められます。

線の太さとマーカーの大きさは`linewidth`、`markersize`で決められます。

```python
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) #　シード値の固定

x = np.linspace(0, 10, 100)
y = np.sin(x) 

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, '-o', label='first', linewidth=0.1, markersize=8) 

plt.title('title') # タイトル
plt.xlabel('x-axis label') # x軸のラベル
plt.ylabel('y-axis label') # y軸のラベル

plt.grid(True) # gridの表示
plt.legend()
```
<img width="269" alt="キャプチャ6.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211712/047f3c7b-cc5a-eb04-8f49-06052d06f9bf.png">


`linestyle`は下記が使用できます。

|character|description|
|:---:|:---:|
|'-'|	solid line style|
|'--'|	dashed line style|
|'-.'|	dash-dot line style|
|':'|	dotted line style|

`marker`は下記が使用できます。（colabだと表示されないものがいくつかあるようです）
[matplotlib で使える marker を全て試してみる－python](http://ailaby.com/plot_marker/)でグラフが見られます。

|character|description|備考|
|:---:|:---:|:---:|
|'.'|	point marker
|','|	pixel marker
|'o'|	circle marker
|'v'|	triangle_down marker
|'^'|	triangle_up marker
|'<'|	triangle_left marker
|'>'|	triangle_right marker
|'1'|	tri_down marker|colabだと表示されない
|'2'|	tri_up marker|colabだと表示されない
|'3'|	tri_left marker|colabだと表示されない
|'4'|	tri_right marker|colabだと表示されない
|'s'|	square marker
|'p'|	pentagon marker
|'*'|	star marker
|'h'|	hexagon1 marker
|'H'|	hexagon2 marker
|'+'|	plus marker|colabだと表示されない
|'x'|	x marker|colabだと表示されない
|'D'|	diamond marker
|'d'|	thin_diamond marker
|バーティカルバー|vline marker|colabだと表示されない
|'_'|	hline marker|colabだと表示されない

### グラフを複数表示する
`subplots`を使用します。`subplots`は`fig`と'ax'を戻り値として返します。`ax`は配列で、`subplots(n,m)`で決めた(n,m)の位置のグラフを作成するのに使用します。
`plt.plot`とは軸ラベルやタイトルの設定の仕方が微妙に異なるので注意が必要です。

1行にグラフを3つ表示する場合。

```python
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) #　シード値の固定

x = np.linspace(0, 10, 100)
y = []
y.append(np.sin(x))
y.append(np.cos(x))
y.append(np.tan(x))

# タイトルを配列に格納
title=['title1','title2','title3']

# 3つのグラフを配置する枠をつくる 
# figが3つのグラフが入る全体の枠で、axがそれぞれのグラフ
fig,ax = plt.subplots(1,3,figsize=(18,5))

# グラフ間の幅を調整
plt.subplots_adjust(wspace=0.4, hspace=0.3)

# グラフを作る
for i in range(3):
    ax[i].plot(x, y[i], '-')
    ax[i].set_title(title[i]) # タイトル
    ax[i].set_xlabel('x-axis label') # x軸のラベル
    ax[i].set_ylabel('y-axis label') # y軸のラベル
plt.show()
```
<img width="817" alt="キャプチャ7.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211712/f7448eb2-f673-1f5b-87e1-06c61b0b6dec.png">


2行3列のグラフをつくります。

```python
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) #　シード値の固定

x = np.linspace(0, 10, 100)
y = [[[] for i in range(3)] for i in range(2) ]
y[0][0] = np.sin(x) + np.random.randn(100)
y[0][1] = np.sin(x)
y[0][2] = np.cos(x)
y[1][0] = x**2
y[1][1] = np.log(x+1)
y[1][2] = np.exp(x)

names=['1','2','3']
fig,ax=plt.subplots(2,3,figsize=[10,5])
plt.subplots_adjust(wspace=0.6, hspace=0.6)
for i in range(2):
    for j in range(3):
        ax[i,j].plot(x,y[i][j])
        ax[i,j].set_xlabel('x-axis label') # x軸のラベル
        ax[i,j].set_ylabel('y-axis label') # x軸のラベル
        ax[i,j].set_title('%s-%s'%(names[i],names[j]))
plt.show()
```

<img width="478" alt="キャプチャ11.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211712/d29becfe-0bdd-79e9-32d1-00168738f512.png">

レイアウトの詳細は[matplotlib基礎 | figureやaxesでのグラフのレイアウト](https://qiita.com/tsuruokax/items/90167693f142ebb55a7d)がわかりやすいです。

軸を揃える場合は`sharey`を使います。`row`、`col`、`all`で行ごと、列ごと、全てのグラフで軸を揃えることができます。

```python
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) #　シード値の固定

x = np.linspace(0, 10, 100)
y = [[[] for i in range(3)] for i in range(2) ]
y[0][0] = np.sin(x) + np.random.randn(100)
y[0][1] = np.sin(x)
y[0][2] = np.cos(x)
y[1][0] = x**2
y[1][1] = np.log(x+1)
y[1][2] = np.exp(x)


names=['1','2','3']
fig,ax=plt.subplots(2, 3, figsize=[10,5], sharey='row')
plt.subplots_adjust(wspace=0.6, hspace=0.6)
for i in range(2):
    for j in range(3):
        ax[i,j].plot(x,y[i][j])
        ax[i,j].set_xlabel('x-axis label') # x軸のラベル
        ax[i,j].set_ylabel('y-axis label') # x軸のラベル
        ax[i,j].set_title('%s-%s'%(names[i],names[j]))
plt.show()
```
<img width="467" alt="キャプチャ13.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211712/095154b3-771c-2652-2401-8ac0c941fbc4.png">

グラフ1個でも`subplots`は使えます。

```python
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)

fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')
```
<img width="374" alt="キャプチャ12.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211712/dd3bfb9b-ce43-748a-f3da-1973af638c48.png">