折れ線グラフをJupyter Notebook上でシンプルに表示する

Matplotlibを使ってJupyter Notebook上でヒストグラムや散布図を表示させる方法です。

この記事の内容は、以下の記事に従って準備したJupyter Notebookの環境で試しています。
[Jupyter NotebookをDockerを使って簡単にインストールし起動（nbextensions、Scalaにも対応） - Qiita](https://qiita.com/suzuki-navi/items/37615024d4748aac6688)

この環境でブラウザで8888番ポートにアクセスして、Jupyter Notebookを使うことができます。右上のボタンのNew > Python3をたどると新しいノートを開けます。

ヒストグラム・散布図については以下の記事参照。
[ヒストグラム・散布図をJupyter Notebook上で表示する - Qiita](https://qiita.com/suzuki-navi/items/9f5fd47734b22b4adf71)


# データ準備

1列目がx、2列目がy軸を想定したサンプルデータを2つ用意しました。

```test1.csv
0,100
1,110
2,108
4,120
6,124
```

```test2.csv
0,90
1,95
2,99
3,104
4,108
5,111
6,115
```

Jupyter Notebookを開いて、各種importです。

```python
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
```

データを読み込みます。

```python
df1 = pd.read_csv("test1.csv", names=["x", "y"])
df2 = pd.read_csv("test2.csv", names=["x", "y"])
```

`df`はPandasのDataFrameのオブジェクトになります。

CSVからの読み込みとDataFrameの扱いについては以前の記事参照。
[DataFrameに対する基本操作を試す - Qiita](https://qiita.com/suzuki-navi/items/6bd8377ca7974779a822)

# CSVファイルのデータを折れ線グラフに

```python
plt.plot(df1["x"], df1["y"])
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/790ab87a-66bf-fbbe-4552-88ffad54a905.png)

`df1["x"]`、`df1["y"]`はPandasのSeriesのオブジェクトで、`plt.plot`に渡せるようです。

[matplotlib.pyplot.plot — Matplotlib 3.1.1 documentation](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html)

2つのグラフを重ねることもできます。

```python
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(df1["x"], df1["y"])
ax1.plot(df2["x"], df2["y"])
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/87c21a86-558a-cf3c-f75f-623cdc9ff450.png)


# 任意の関数をグラフに

```math
y = x^2 + 3x + 80
```

という関数のグラフを書いてみます。

```python
x3 = np.linspace(0, 6, 13)
y3 = x3 * x3 + 3.0 * x3 + 80.0
plt.plot(x3, y3)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/9a5f8ee4-f02f-8e14-018f-3bc42084134d.png)

`np.linspace(0, 6, 7)`は`0 , 0.5, 1 , 1.5, 2 , 2.5, 3 , 3.5, 4 , 4.5, 5 , 5.5, 6 `という要素を持つNumPyのndarrayという配列を返します。0と6を両端にして全部で13個の数値を均等に並べた配列です。

[numpy.linspace — NumPy v1.17 Manual](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html)

ndarrayに四則演算を施すと同じ要素数のndarrayになるので、`x3 * x3 + 3.0 * x3 + 80.0`も7個の数値を含むndarrayになります。

xとyをそれぞれ配列にして`plt.plot`に渡せばCSVデータと同じようにグラフにできます。`plt.plot`には先ほどはPandasのSeriesを渡していましたが、NumPyのndarrayも渡せるようです。

CSVファイルのデータと重ねての表示もできます。

```python
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(df1["x"], df1["y"])
ax1.plot(df2["x"], df2["y"])
ax1.plot(x3, y3)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/a847a855-4c3a-41dd-664e-d881b687d453.png)


# オプション

`plot`に`marker`という引数を渡すと、データの点の形を指定できます。

```python
x3 = np.linspace(0, 6, 13)
y3 = x3 * x3 + 3.0 * x3 + 80.0
plt.plot(x3, y3, marker=".")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/1ccca2cd-b063-8a65-9d77-811a5266db2c.png)

```python
x3 = np.linspace(0, 6, 13)
y3 = x3 * x3 + 3.0 * x3 + 80.0
plt.plot(x3, y3, marker="o")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/44d83766-8a4c-b997-5bd1-5eb4a2d768ba.png)

`marker`に指定できる文字列は以下のレファレンスを参照。
[matplotlib.markers — Matplotlib 3.1.1 documentation](https://matplotlib.org/3.1.1/api/markers_api.html)

`linewidth`という引数で先の幅を指定できます。0を指定すると線なしになります。

```python
x3 = np.linspace(0, 6, 13)
y3 = x3 * x3 + 3.0 * x3 + 80.0
plt.plot(x3, y3, marker="o", linewidth=0)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/c4ab3036-664c-9d80-5ea0-6040494f0278.png)

その他のオプションも以下のレファレンスに載っています。
[matplotlib.pyplot.plot — Matplotlib 3.1.1 documentation](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html)

以上。