【Matplotlib】折れ線グラフを描画する方法 | matplotlib.pyplot

## 【はじめに】

Matplotlib はPythonのグラフ描画のためのライブラリです。
Matplotlibを使うことで、グラフの描画やデータの可視化が簡単に行えます。
今回はMatplotlibの基本として、折れ線グラフを描画する方法を紹介します。

### 本記事の内容

- Matplotlibをインポート
- 使用するデータを読み込む
- グラフを描くためのデータを作る
- 折れ線グラフの作成
- ラベルの追加
- グラフの色変更
- グラフ線の太さ変更
- マーカーの付与
- グラフ線のスタイル変更
- グラフタイトルの追加
- グラフの大きさ変更
- 複数のグラフを表示
- グラフを画像として保存

## 【Matplotlibをインポート】

matplotlibの中のpyplotを読み込みます。

また、Jupyter Notebook内にグラフを出力させるために`%matplotlib inline`を記述します。

```Python
import matplotlib.pyplot as plt
%matplotlib inline
```

**ポイント**

- `as`を使用して`plt`という名前で使用することが多いです。
- `%matplotlib inline`は通常のpyファイルで記述する場合は不要となります。

## 【使用するデータを読み込む】

Pythonライブラリである「Pandas」をインポートしてcsvファイルをDataFrameとして読み込みます。

使用するデータは、「1920年から2015年までの全国の人口推移のデータ」とします。

```Python
import pandas as pd

df = pd.read_csv('data.csv', encoding='shift-jis')
df
```

|                      | 都道府県コード | 都道府県名 | 元号 | 和暦（年） | 西暦（年） | 人口（総数） | 人口（男） | 人口（女） | 
| -------------------- | -------------- | ---------- | ---- | ---------- | ---------- | ------------ | ---------- | ---------- | 
| 0                    | 1              | 北海道     | 大正 | 9          | 1920       | 2359183      | 1244322    | 1114861    | 
| 1                    | 2              | 青森県     | 大正 | 9          | 1920       | 756454       | 381293     | 375161     | 
| 2                    | 3              | 岩手県     | 大正 | 9          | 1920       | 845540       | 421069     | 424471     | 
| 3                    | 4              | 宮城県     | 大正 | 9          | 1920       | 961768       | 485309     | 476459     | 
| 4                    | 5              | 秋田県     | 大正 | 9          | 1920       | 898537       | 453682     | 444855     | 
| ...                  | ...            | ...        | ...  | ...        | ...        | ...          | ...        | ...        | 
| 934                  | 43             | 熊本県     | 平成 | 27         | 2015       | 1786170      | 841046     | 945124     | 
| 935                  | 44             | 大分県     | 平成 | 27         | 2015       | 1166338      | 551932     | 614406     | 
| 936                  | 45             | 宮崎県     | 平成 | 27         | 2015       | 1104069      | 519242     | 584827     | 
| 937                  | 46             | 鹿児島県   | 平成 | 27         | 2015       | 1648177      | 773061     | 875116     | 
| 938                  | 47             | 沖縄県     | 平成 | 27         | 2015       | 1433566      | 704619     | 728947     | 
| 939 rows × 8 columns |                |            |      |            |            |              |            |            | 


私のGitHubに「data.csv」としてアップロードしてあるので、下記コマンドでダウンロードすれば簡単に準備できます。

```Shell
$ curl https://raw.githubusercontent.com/nakachan-ing/python-references/master/Matplotlib%26Seaborn/data.csv -O
```

## 【グラフを描くためのデータを作る】

データをグラフにするには、**データに対するどのような情報が必要なのか**をはっきりさせることが重要です。

今回は「1920年から2015年までの全国の人口推移のデータ」から、東京都の人口推移をグラフにすることにします。

読み込んだデータから、「都道府県名」が「東京都」のデータを取得して新たなDataFrameとして作成します。

```Python
population_of_tokyo = df[df['都道府県名']=='東京都']
population_of_tokyo
```

|     | 都道府県コード | 都道府県名 | 元号 | 和暦（年） | 西暦（年） | 人口（総数） | 人口（男） | 人口（女） | 
| --- | -------------- | ---------- | ---- | ---------- | ---------- | ------------ | ---------- | ---------- | 
| 12  | 13             | 東京都     | 大正 | 9          | 1920       | 3699428      | 1952989    | 1746439    | 
| 59  | 13             | 東京都     | 大正 | 14         | 1925       | 4485144      | 2387609    | 2097535    | 
| 106 | 13             | 東京都     | 昭和 | 5          | 1930       | 5408678      | 2855323    | 2553355    | 
| 153 | 13             | 東京都     | 昭和 | 10         | 1935       | 6369919      | 3325696    | 3044223    | 
| 200 | 13             | 東京都     | 昭和 | 15         | 1940       | 7354971      | 3795875    | 3559096    | 
| 247 | 13             | 東京都     | 昭和 | 20         | 1945       | 3488284      | 1788145    | 1700139    | 
| 293 | 13             | 東京都     | 昭和 | 25         | 1950       | 6277500      | 3169389    | 3108111    | 
| 340 | 13             | 東京都     | 昭和 | 30         | 1955       | 8037084      | 4115823    | 3921261    | 
| 387 | 13             | 東京都     | 昭和 | 35         | 1960       | 9683802      | 4997023    | 4686779    | 
| 434 | 13             | 東京都     | 昭和 | 40         | 1965       | 10869244     | 5564583    | 5304661    | 
| 481 | 13             | 東京都     | 昭和 | 45         | 1970       | 11408071     | 5801009    | 5607062    | 
| 528 | 13             | 東京都     | 昭和 | 50         | 1975       | 11673554     | 5913373    | 5760181    | 
| 575 | 13             | 東京都     | 昭和 | 55         | 1980       | 11618281     | 5856280    | 5762001    | 
| 622 | 13             | 東京都     | 昭和 | 60         | 1985       | 11829363     | 5955029    | 5874334    | 
| 669 | 13             | 東京都     | 平成 | 2          | 1990       | 11855563     | 5969773    | 5885790    | 
| 716 | 13             | 東京都     | 平成 | 7          | 1995       | 11773605     | 5892704    | 5880901    | 
| 763 | 13             | 東京都     | 平成 | 12         | 2000       | 12064101     | 6028562    | 6035539    | 
| 810 | 13             | 東京都     | 平成 | 17         | 2005       | 12576601     | 6264895    | 6311706    | 
| 857 | 13             | 東京都     | 平成 | 22         | 2010       | 13159388     | 6512110    | 6647278    | 
| 904 | 13             | 東京都     | 平成 | 27         | 2015       | 13515271     | 6666690    | 6848581    | 


## 【折れ線グラフの作成】

`plt.plot()`の引数にX軸とY軸とするカラムを指定します。

`plt.show()`とすることで、グラフが作成されます。

X軸に「西暦（年）」、Y軸に「人口（総数）」を指定して、人口の推移をグラフにしてみます。

```Python
x = population_of_tokyo['西暦（年）']
y = population_of_tokyo['人口（総数）']

plt.plot(x, y)
plt.show()
```

[![Image from Gyazo](https://i.gyazo.com/1da7bdbb889f57673e704d8b77d8d217.png)](https://gyazo.com/1da7bdbb889f57673e704d8b77d8d217)

グラフを見ると1940年から1950年の間に急激に人口が減っていることが見て分かります。（今回、原因までは考えないことにします。）

## 【ラベルの追加】

先ほどのグラフで人口の推移を見ることはできましたが、第三者から見てX軸とY軸がそれぞれ何を示しているかひと目では分かりません。

`plt.xlabel`、`plt.ylabel`の引数に名前を指定することで、それぞれの軸にラベルを付けることが出来ます。

日本語でラベルを付ける場合、matplotlibはデフォルトでは日本語対応していないため、`japanize-matplotlib`をインストールします。

```Python
!pip install japanize-matplotlib
```

```
Requirement already satisfied: japanize-matplotlib in /Users/nakadakyota/opt/anaconda3/lib/python3.9/site-packages (1.1.3)
Requirement already satisfied: matplotlib in /Users/nakadakyota/opt/anaconda3/lib/python3.9/site-packages (from japanize-matplotlib) (3.4.3)
Requirement already satisfied: kiwisolver>=1.0.1 in /Users/nakadakyota/opt/anaconda3/lib/python3.9/site-packages (from matplotlib->japanize-matplotlib) (1.3.1)
Requirement already satisfied: cycler>=0.10 in /Users/nakadakyota/opt/anaconda3/lib/python3.9/site-packages (from matplotlib->japanize-matplotlib) (0.10.0)
Requirement already satisfied: numpy>=1.16 in /Users/nakadakyota/opt/anaconda3/lib/python3.9/site-packages (from matplotlib->japanize-matplotlib) (1.21.6)
Requirement already satisfied: pyparsing>=2.2.1 in /Users/nakadakyota/opt/anaconda3/lib/python3.9/site-packages (from matplotlib->japanize-matplotlib) (3.0.4)
Requirement already satisfied: pillow>=6.2.0 in /Users/nakadakyota/opt/anaconda3/lib/python3.9/site-packages (from matplotlib->japanize-matplotlib) (8.4.0)
Requirement already satisfied: python-dateutil>=2.7 in /Users/nakadakyota/opt/anaconda3/lib/python3.9/site-packages (from matplotlib->japanize-matplotlib) (2.8.2)
Requirement already satisfied: six in /Users/nakadakyota/opt/anaconda3/lib/python3.9/site-packages (from cycler>=0.10->matplotlib->japanize-matplotlib) (1.16.0)
```

```Python
import japanize_matplotlib
```

```Python
plt.plot(x, y)
plt.xlabel('西暦（年）')
plt.ylabel('人口（総数）')
plt.show()
```

[![Image from Gyazo](https://i.gyazo.com/5c928befbb58d1b7b98e5aef95ecfa68.png)](https://gyazo.com/5c928befbb58d1b7b98e5aef95ecfa68)
X軸とY軸にラベルを追加することが出来ました。

## 【グラフの色変更】

`plt.plot()`の引数`color`に色を指定して、グラフの色を変更します。

指定できる色はMatplotlibの公式ドキュメントから確認出来ます。

https://matplotlib.org/2.0.2/examples/color/named_colors.html

```Python
plt.plot(x, y, color='red')
plt.xlabel('西暦（年）')
plt.ylabel('人口（総数）')
plt.show()
```

[![Image from Gyazo](https://i.gyazo.com/31ed142606592cb16417b5950f76e861.png)](https://gyazo.com/31ed142606592cb16417b5950f76e861)
グラフの色を変更することが出来ました。

**ポイント**

- 色を指定するときに「red」を「r」、「blue」を「b」のように省略して指定することが出来ます。
- カラーコード（#A8C38Bなど)で指定することも可能です。

## 【グラフ線の太さ変更】

`plt.plot()`の引数`linewidth`に数値(pt)を指定して、グラフ線の太さを変更します。

```Python
plt.plot(x, y, linewidth=5)
plt.xlabel('西暦（年）')
plt.ylabel('人口（総数）')
plt.show()
```

[![Image from Gyazo](https://i.gyazo.com/79c2cc425c2419c18dec2ddc8bcc3a71.png)](https://gyazo.com/79c2cc425c2419c18dec2ddc8bcc3a71)

グラフ線の太さを変更することが出来ました。

## 【マーカーの付与】

`plt.plot()`の引数`marker`にX軸とY軸の交わる部分の印を指定して、よりグラフを見やすくしていきます。

アルファベットの`o`を指定することでo印のマーカー、アルファベットの`x`を指定すればx印のマーカーを付与します。

その他、使用できるマーカーは公式ドキュメントから確認することが出来ます。

https://matplotlib.org/stable/api/markers_api.html

```Python
plt.plot(x, y, marker="o")
plt.xlabel('西暦（年）')
plt.ylabel('人口（総数）')
plt.show()
```

[![Image from Gyazo](https://i.gyazo.com/6ddc96c7cf8e2f0753cbc19289dd4e32.png)](https://gyazo.com/6ddc96c7cf8e2f0753cbc19289dd4e32)
マーカーを付与することが出来ました。

## 【グラフ線のスタイル変更】

`plt.plot()`の引数`linestyle`にスタイルを指定して、グラフ線のスタイルを変更します。

指定できるスタイルは公式ドキュメントから確認できます。

https://matplotlib.org/stable/gallery/lines_bars_and_markers/linestyles.html

```Python
plt.plot(x, y, linestyle="dotted")
plt.xlabel('西暦（年）')
plt.ylabel('人口（総数）')
plt.show()
```

[![Image from Gyazo](https://i.gyazo.com/3561f452abdafb8d5697aca2edc4ba5b.png)](https://gyazo.com/3561f452abdafb8d5697aca2edc4ba5b)
グラフ線のスタイルを変更することが出来ました。

## 【グラフタイトルの追加】

`plt.title()`の引数にタイトルを指定することで、グラフタイトルを表示することが出来ます。

```Python
plt.plot(x, y, marker="o")
plt.xlabel('西暦（年）')
plt.ylabel('人口（総数）')
plt.title('1920年から2015年までの東京都の人口（総数）推移')
plt.show()
```

[![Image from Gyazo](https://i.gyazo.com/a718b67c2c9a97709ad69bbd6daff5dd.png)](https://gyazo.com/a718b67c2c9a97709ad69bbd6daff5dd)

## 【グラフの大きさ変更】

`plt.figure()`の引数`figsize`に幅と高さを指定することで、グラフの大きさを変更することが出来ます。

数値はインチ単位で画像の「幅」と「高さ」を指定します。

```Python
plt.figure(figsize=(16,10))
plt.plot(x, y, marker="o")
plt.xlabel('西暦（年）')
plt.ylabel('人口（総数）')
plt.title('1920年から2015年までの東京都の人口（総数）推移')
plt.show()
```

[![Image from Gyazo](https://i.gyazo.com/f68f6df260240517140794fddef5a7e1.png)](https://gyazo.com/f68f6df260240517140794fddef5a7e1)

## 【複数のグラフを表示】

`plt.plot()`のX軸は変えずに、Y軸のデータを指定することで複数のグラフを一つの図の中に作成します。

複数のグラフを表示する場合は、引数`label`でそれぞれがどのデータを示しているのかを分かりやすくしましょう。

また、`plt.legend()`で凡例表示させます。

```Python
y2 = population_of_tokyo['人口（男）']
y3 = population_of_tokyo['人口（女）']

plt.figure(figsize=(16,10))
plt.plot(x, y, marker="o", label='人口（総数）')
plt.plot(x, y2, marker="o", label='人口（男）')
plt.plot(x, y3, marker="o", label='人口（女）')

plt.xlabel('西暦（年）')
plt.ylabel('人口')
plt.title('1920年から2015年までの東京都の人口（総数）推移')
plt.legend()
plt.show()
```

[![Image from Gyazo](https://i.gyazo.com/5f6291999a6a985e1f46d066922502f5.png)](https://gyazo.com/5f6291999a6a985e1f46d066922502f5)
複数のグラフを表示することが出来ました。

## 【グラフを画像として保存】

作成したグラフを、画像にして保存することもできます。

`plt.figure()`を変数に代入し、`savefig()`の引数に保存した名前を指定することで画像として保存します。

```Python
fig = plt.figure(figsize=(16,10))

plt.plot(x, y, marker="o", label='人口（総数）')
plt.plot(x, y2, marker="o", label='人口（男）')
plt.plot(x, y3, marker="o", label='人口（女）')

plt.xlabel('西暦（年）')
plt.ylabel('人口')
plt.title('1920年から2015年までの東京都の人口（総数）推移')
plt.legend()

fig.savefig('graph.png')
```

## 【さいごに】

今回はMatplotlibを使って折れ線グラフを描画する方法を紹介しました。

Pythonでグラフを描画するには標準的なライブラリなので、この機会にMatplotlibの使い方を覚えていきましょう。

使用したCSVファイルやJupyter NotebookはGitHubに公開しています。
Jupyter Notebookは下記コマンドでダウンロードできるので、自由に使って是非練習してみてください。

```Shell
$ curl https://raw.githubusercontent.com/nakachan-ing/python-references/master/Matplotlib%26Seaborn/Matplotlibで折れ線グラフを描く方法.ipynb -O
```

https://github.com/nakachan-ing/python-references/tree/master/Matplotlib&Seaborn