理系レポートのためのmatplotlib入門

## 導入
matplotlibを用いての理系レポートの作成において，学生レポートに使用できるようなグラフ体裁を載せているQiitaが見当たらなかったため，初心者ながら書かせていただきます．
拙い点多々あるかと思いますが，温かい目で見ていただけると幸いです．

## 環境

- googlecolabratory


## グラフの作成
### 必要最低限のコード
ここでは必要最低限のものを載せる.必要な説明はコメント(#)で載せてあるため，説明は割愛することとする．必要なものがあれば下の項目から探して追加してほしい

```python
import matplotlib

# データ点の定義
x = [1,2,3]
y = [2,3,1]

# 画像を用意
fig = matplotlib.pyplot.figure()

# figの上にsubplotを用いてグラフオブジェクトを作成
graph = fig.add_subplot(1,1,1)

# データ点を散布図にしてグラフエリアに描画
graph.scatter(x,y)

# 表示
matplotlib.pyplot.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615195/bbd37625-659a-6570-623a-3b0eb28715a5.png)

<h2>第二軸の作成</h2>
理系レポートでは上軸と右軸にも目盛りをつけなくてはならない．その時は `グラフオブジェクト.twinx()` や `グラフオブジェクト.twiny()` メソッドを使うと副軸を作成できる.

```python
import matplotlib

x = [1,2,3]
y = [2,3,1]

fig = matplotlib.pyplot.figure()

graph = fig.add_subplot(1,1,1)
graph.scatter(x,y)

# x軸の第二軸の軸オブジェクトを定義
axis_x = graph.twinx()

# x軸の第二軸の軸オブジェクトを定義
axis_y = graph.twiny()

matplotlib.pyplot.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615195/86458cf7-b8ab-a685-5686-da7ef26149f2.png)

### 軸の定義域の設定
グラフの定義域を変更したい場合は{グラフor軸オブジェクト}.set_xlim({low},{upper}) or set_ylim({low},{upper})にて設定を行える.

```python
import matplotlib

x = [1,2,3]
y = [2,3,1]

figure = matplotlib.pyplot.figure()

graph = figure.add_subplot(1,1,1)
graph.scatter(x,y)

# 0~10で定義域を設定
graph.set_ylim(0,10)

# -10~10で定義域を設定
graph.set_xlim(-10,10)

matplotlib.pyplot.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615195/0f5cede0-c624-f607-4d1d-be4f19caee15.png)

前章の第二軸でも上軸と下軸があっていないのでそれをそろえるため，{グラフ or 軸オブジェクト}.get_xlim()で定義域を取得し，それをもとに第二軸の定義域を定めている．

```python
import matplotlib

x = [1,2,3]
y = [2,3,1]

figure = matplotlib.pyplot.figure()

graph = figure.add_subplot(1,1,1)
graph.scatter(x,y)


axis_x = graph.twinx()
# get_ylimで取得した定義域を第二軸に適応
axis_x.set_ylim(graph.get_ylim())

axis_y = graph.twiny()
# get_xlimで取得した定義域を第二軸に適応
axis_y.set_xlim(graph.get_xlim())

matplotlib.pyplot.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615195/8422c43a-5b10-e487-3ab8-c1670bf03822.png)

### 目盛りを内側にする
理系レポートでのグラフは目盛りを内側にするのがデフォルトである．そんな時は`グラフ or 軸オブジェクト}.tick_params(direction = 'in')`を用いて内側にすることができる．

```python
import matplotlib

x = [1,2,3]
y = [2,3,1]

figure = matplotlib.pyplot.figure()

graph = figure.add_subplot(1,1,1)
graph.scatter(x,y)

# グラフ主軸を内側にする
graph.tick_params(direction = "in")

matplotlib.pyplot.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615195/c43af2f1-2dcc-ade3-ebc0-bd7670ad5476.png)

### 目盛りの数字をなくす
目盛りに書いてある1.00や3.00を消す方法をここでは触れる.`グラフ or 軸オブジェクト.setxticklabels()`の引数に空配列を指定することですべての目盛りが消える．

```python
 import matplotlib

x = [1,2,3]
y = [2,3,1]

figure = matplotlib.pyplot.figure()

graph = figure.add_subplot(1,1,1)
graph.scatter(x,y)

# 目盛りの数値を消滅させる
graph.set_xticklabels([])
graph.set_yticklabels([])

matplotlib.pyplot.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615195/0ae3f395-bbd7-7067-53fa-2e895f54c0d1.png)

### 対数軸を利用する
データ点の幅が広いときは対数表記にするのが通例になっている．その時は`グラフ or 軸オブジェクト.set_xscale('log')`を利用するとよい．

```python
import matplotlib

x = [100,2,30]
y = [2,30,100]

figure = matplotlib.pyplot.figure()

gragh_1 = figure.add_subplot(1,1,1)
gragh_1.scatter(x,y)

# x軸もy軸も対数プロットにした両対数を作成
gragh_1.set_xscale("log")
gragh_1.set_yscale("log")

matplotlib.pyplot.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615195/4d26735e-1e88-1d4c-dea5-b5970b537b0a.png)

### 二つのグラフをプロット
<p>二つの実験データを比較したいとき同じグラフに行るグラフを乗っけるときが多々ある．その時は`グラフオブジェクト.図の種類(データ配列)`で乗っけることができる.</p>

```python
import matplotlib
import math

x = [1,2,3]
y = [2,3,1]

# 二つ目としてsinカーブのデータを定義
x2 = [i/10 for i in range(0,100)]
y2 = [math.sin(i) for i in x2]

fig = matplotlib.pyplot.figure()

graph_1 = fig.add_subplot(1,1,1)
graph_1.scatter(x,y)
# sinカーブを折れ線グラフとしてプロット
graph_1.plot(x2,y2)


matplotlib.pyplot.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615195/8fc8b977-2c85-9fb0-52b8-8e5e38131fc7.png)

### 軸ラベルを置く
x軸,y軸がそれぞれ何を表しているかを表すものを軸ラベルという．matplotlibでは`グラフ or 軸オブジェクト.set_xlabel(ラベル名)`で設定できる.ラベル名は＄マークで挟むことによってTeX形式を用いることも可能である．

```python
import matplotlib

x = [100,2,30]
y = [2,30,100]

figure = matplotlib.pyplot.figure()

gragh_1 = figure.add_subplot(1,1,1)
gragh_1.scatter(x,y)

# x軸,y軸にラベルを作成
gragh_1.set_xlabel("temperture $T$/K")
gragh_1.set_ylabel("time $t$/s")

matplotlib.pyplot.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615195/2a51378a-8192-aa02-2468-6c8d283ddef9.png)

### 完成品
すべてを使用した完成品を下に示す

```python
import matplotlib

# データの定義
x = [1,200,3000,1251]
y = [200,3000,1251,1000]

# 画像オブジェクトの定義
figure = matplotlib.pyplot.figure()

# グラフオブジェクトの作成
gragh_1 = figure.add_subplot(1,1,1)
# グラフオブジェクトを散布図に設定
gragh_1.scatter(x,y)

# 軸ラベルを付ける
gragh_1.set_xlabel("$time $ t $ /s$")
gragh_1.set_ylabel("$tempertue $ T $ /s$")

# 第二軸(上)を作成し，定義域を下と合わせる
axis_x = gragh_1.twinx()
axis_x.set_ylim(gragh_1.get_ylim())

# 第二軸(右)を作成し，定義域を左と合わせる
axis_y = gragh_1.twiny()
axis_y.set_xlim(gragh_1.get_xlim())

# すべてを対数プロットを採用
gragh_1.set_xscale("log")
gragh_1.set_yscale("log")
axis_x.set_yscale("log")
axis_y.set_xscale("log")

# 対数プロットをすると定義域がずれるので再定義
axis_x.set_ylim(gragh_1.get_ylim())
axis_y.set_xlim(gragh_1.get_xlim())

# すべてを内向きにする
gragh_1.tick_params(which='both',direction = "in")
axis_x.tick_params(which='both',direction = "in")
axis_y.tick_params(which='both',direction = "in")

# 目盛りの数値を非表示にする
axis_y.set_xticklabels([])
axis_x.set_yticklabels([])

matplotlib.pyplot.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615195/1dec2ebb-1860-c26d-6b40-9853f9e2b6c8.png)


<p>以上になります．本記事で触れたのは使える最低限の知識であり，legendを入れたり，最小二乗法を入れたい場合は別記事をご参照ください．</p>
<p>最後まで駄文を読んでくださりありがとうございました．</p>