Python3-Matplotlibの使い方 ~信号処理~ 複数信号の表示，間隔・空白の調整など

### はじめに
matplotlibの使い方に関して，少しだけ知識が溜まってきたので一度整理します．

https://matplotlib.org/

### 基本のグラフ
例えば以下のようなプログラムを実行してみましょう．

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

# 表示する信号 #######################
fs = 44.1e3
T = 1
f = 3
t = np.arange(0, T-1/fs, 1/fs)
x = np.sin(2*np.pi*f*t)
###################################

# Set global plot style
plt.rcParams.update({
    "text.usetex": True,
    "mathtext.fontset": 'stix',
    "font.family": "STIXGeneral",
    "font.sans-serif": "STIXGeneral",
    'font.size': 15,
    'xtick.direction': 'in',
    'ytick.direction': 'in',
    'xtick.major.width': 1.0,
    'ytick.major.width': 1.0,
    'axes.linewidth': 1.0,
})  

# プロットの作成 ########################################
fig, axes = plt.subplots(dpi=300) # プロットを作成
fig.patch.set_facecolor('white') # 背景色
fig.set_size_inches(5, 3) # 比率を設定する

axes.plot(t,x) # 表示

axes.set_xlabel("Time [s]") # x軸ラベル
axes.set_ylabel("Amplitude [a.u.]") # y軸ラベル

fig.tight_layout() # 細いレイアウトにする

plt.savefig("sample.png", dpi=300) # 保存する

plt.show() # 表示する
####################################################
```

結果は以下のようになります．

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/ef041e60-cb3a-6a0d-66d1-cbdb40887e15.png)

### 複数の表示
複数のグラフを表示したい場合，以下のプログラムが考えられます．

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

# 表示する信号 #######################
fs = 44.1e3
T = 1
f1 = 3
t = np.arange(0, T-1/fs, 1/fs)
x1 = np.sin(2*np.pi*f1*t)

f2 = 5
x2 = np.sin(2*np.pi*f2*t)
###################################

# Set global plot style
plt.rcParams.update({
    "text.usetex": True,
    "mathtext.fontset": 'stix',
    "font.family": "STIXGeneral",
    "font.sans-serif": "STIXGeneral",
    'font.size': 15,
    'xtick.direction': 'in',
    'ytick.direction': 'in',
    'xtick.major.width': 1.0,
    'ytick.major.width': 1.0,
    'axes.linewidth': 1.0,
})  

# プロットの作成 ########################################
fig, axes = plt.subplots(dpi=300) # プロットを作成
fig.patch.set_facecolor('white') # 背景色
fig.set_size_inches(5, 3) # 比率を設定する

axes.plot(t,x1) # 表示
axes.plot(t,x2)

axes.set_xlabel("Time [s]") # x軸ラベル
axes.set_ylabel("Amplitude [a.u.]") # y軸ラベル

fig.tight_layout() # 細いレイアウトにする

plt.savefig("sample.png", dpi=300) # 保存する

plt.show() # 表示する
####################################################
```

結果は以下のようになります．

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/8b7bac2f-9cd5-1e79-6444-7d29073053c8.png)

### 複数の表示 ~part2~
重ならず表示したい場合，以下のプログラムが考えられます．

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

# 表示する信号 #######################
fs = 44.1e3
T = 1
f1 = 3
t = np.arange(0, T-1/fs, 1/fs)
x1 = np.sin(2*np.pi*f1*t)

f2 = 5
x2 = np.sin(2*np.pi*f2*t)
###################################

# Set global plot style
plt.rcParams.update({
    "text.usetex": True,
    "mathtext.fontset": 'stix',
    "font.family": "STIXGeneral",
    "font.sans-serif": "STIXGeneral",
    'font.size': 15,
    'xtick.direction': 'in',
    'ytick.direction': 'in',
    'xtick.major.width': 1.0,
    'ytick.major.width': 1.0,
    'axes.linewidth': 1.0,
})  

# プロットの作成 ########################################
fig, axes = plt.subplots(nrows=2, dpi=300) # プロットを作成
fig.patch.set_facecolor('white') # 背景色
fig.set_size_inches(5, 3) # 比率を設定する

axes[0].plot(t,x1) # 表示
axes[1].plot(t,x2)

axes[1].set_xlabel("Time [s]") # x軸ラベル
fig.supylabel("Amplitude [a.u.]", y = 0.56, x = 0.06) # y軸ラベル

fig.tight_layout() # 細いレイアウトにする

plt.savefig("sample.png", dpi=300) # 保存する

plt.show() # 表示する
####################################################
```

結果は以下のようになります．

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/623ed926-8e35-4a97-ea05-2c0b3d3782f2.png)

supylabelという関数によって，y軸の表示が単調であることを解消しています．

https://matplotlib.org/stable/gallery/subplots_axes_and_figures/figure_title.html

### 複数の表示 ~part3~
part2のグラフにおいてxの表示が単調と感じた場合，以下のプログラムが考えられます．

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

# 表示する信号 #######################
fs = 44.1e3
T = 1
f1 = 3
t = np.arange(0, T-1/fs, 1/fs)
x1 = np.sin(2*np.pi*f1*t)

f2 = 5
x2 = np.sin(2*np.pi*f2*t)
###################################

# Set global plot style
plt.rcParams.update({
    "text.usetex": True,
    "mathtext.fontset": 'stix',
    "font.family": "STIXGeneral",
    "font.sans-serif": "STIXGeneral",
    'font.size': 15,
    'xtick.direction': 'in',
    'ytick.direction': 'in',
    'xtick.major.width': 1.0,
    'ytick.major.width': 1.0,
    'axes.linewidth': 1.0,
})  

# プロットの作成 ########################################
fig, axes = plt.subplots(nrows=2, dpi=300) # プロットを作成
fig.patch.set_facecolor('white') # 背景色
fig.set_size_inches(5, 3) # 比率を設定する

axes[0].plot(t,x1,color="m") # 表示
axes[1].plot(t,x2,color="c")

axes[0].spines['bottom'].set_visible(False)
axes[0].xaxis.set_ticks([])
axes[1].spines['top'].set_visible(False)

axes[0].yaxis.set_ticks([0],["0"])
axes[1].yaxis.set_ticks([0],["0"])

fig.tight_layout() # 細いレイアウトにする

fig.subplots_adjust(hspace=0.0)

axes[1].set_xlabel("Time [s]") # x軸ラベル
fig.supylabel("Amplitude [a.u.]", y = 0.56, x = -0.05) # y軸ラベル

plt.savefig("sample.png", dpi=300) # 保存する

plt.show() # 表示する
####################################################
```

結果は以下のようになります．

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/c3ebef38-cb82-9a27-84f4-cf949139c6d2.png)

### さいごに
グラフの作成の際には，上記のテクニックでなんとかなります．

``` python
fig, axes = plt.subplots(ncols=2, dpi=300, gridspec_kw={'width_ratios': [1, 2]})
fig, axes = plt.subplots(nrows=2, dpi=300, gridspec_kw={'height_ratios': [1, 2]})
```

などのコードによって，比率を調整することができます．