csvからmatplotlibを使ってグラフを書く時、必ず書くこと

# はじめに
## 古い情報は初見を殺す凶器
最初にmatplotlibでグラフを描こうとしたら、いくつかコードの書き方があって混乱しました。記事によって書式が異なるとか、立派な**初見殺し**だと思います。この記事を書いている2022年8月現在、時代遅れではない（いや```seaborn```使えば？とかは言われるか？）と思いますが、数か月もすると**初見殺しのための凶器に成り代わっているかも知れません**。その点、読む人はご留意下さい。
## なんでグラフを作るのか？
私は**様式にある程度合わせた形でグラフが描ければそれで良い**って人です。割と平々凡々なグラフを目指しているので、高度な描き方を求める人にこの記事は無用です。
## マニュアルについて
```matplotlib```の公式マニュアルには積極的に触れて欲しいです。最初はweb上の記事を頼って辿って何枚かグラフを作って、その後わかってきた気がした辺りで```matplotlib```のマニュアルを漁るべきです。玉石混交のweb上の記事より、スムーズに情報を得られるはずです。

# 書くこと
## なにはともあれライブラリ
グラフを描くために```matplotlib.pyplot```を、csvファイルを読むために```pandas```を```import```しておく。
```python:
import matplotlib.pyplot as plt
import pandas as pd
```
## データ読み込み
```pandas```を使ってcsvファイルを読み、一旦```numpy```形式に落とす。私はいちいちheaderを書くのが面倒なので、```df.columns.values.tolist()```でheader情報を抽出して列番号で指定します。```import numpy as np```は不要と認識してますが、どうでしょう？
```python:
fn = "hoge.csv"
df = pd.read_csv(fn,encoding='cp932')
hd = df.columns.values.tolist()
x1 = df[hd[0]].values
y1 = df[hd[1]].values
```
## デフォルトのフォント設定
デフォルトのフォントとフォントサイズの指定。これしか使わない気がする。
```python:
plt.rcParams["font.family"] = "DejaVu serif"
plt.rcParams["font.size"] = 9
```
## グラフを描くエリアの大きさ設定
グラフを描く領域の大きさと、何分割してグラフを設置するか定めます。後から追加する流儀もあるようですが、私は最初から```subplots```で定めます。どう並べるかによって```ax(s)```の形が変わるので注意。
```python:ひとつだけ
cm = 1/2.54
fig, ax = plt.subplots(1, 1, figsize=(14*cm,9*cm),dpi=600,layout='constrained')
ax.hoge
```
```python:縦にスタック
cm = 1/2.54
fig, axs = plt.subplots(2, 1, figsize=(14*cm,9*cm),dpi=600,layout='constrained')
axs[0].hoge
```
```python:縦横にスタック
cm = 1/2.54
fig, axs = plt.subplots(2, 2, figsize=(14*cm,9*cm),dpi=600,layout='constrained')
axs[0,0].hoge
```
## グラフひとつひとつの設定
目盛を内側に向ける。
```python:
axs[0,0].tick_params(which="both",direction="in")
axs[0,0].tick_params(left=True,right=True,top=True,bottom=True)
```
各軸にラベル付けをする。グラフを並べる時、ラベルを貼りたくないグラフがあるなら、そこには何も書かなければ大丈夫、のはず？```axes.set()```で定めていくStyleが私は好きです。
```python:
axs[0,0].set(xlabel='hoge [hoge]')
axs[0,0].set(ylabel='hoge [hoge]')
```
各軸の値の範囲を定める。
```python:
axs[0,0].set(xlim=[0,1])
axs[0,0].set(ylim=[0,1])
```
軸と軸の値ラベルが近い時は、これで調整。
```python:
axs[0,0].tick_params(pad=5)
```
プロットしましょう。
```python:
axs[0,0].plot(x1, y4, label="hoge1")
```
凡例を突っ込みまして。
```python:
axs[0,0].legend(loc='upper left', bbox_to_anchor=(0,1))
```
こういった作業を、すべての```ax(s)```に対して行います。
## 出来上がったグラフを保存
pdfとpngに保存です。データ点数が多い時はpdfが地獄のように重たくなるのでpngで表示します。ラスタ画像なら全部必死に描いたりせず、各画素がそれぞれ何色～という処理だけで済むので、軽い。
```python:
fig.savefig("hoge.pdf")
fig.savefig("hoge.png")
```
# つなげたもの
```python:
import matplotlib.pyplot as plt
import pandas as pd

fn = "hoge.csv"
df = pd.read_csv(fn,encoding='cp932')
hd = df.columns.values.tolist()
x1 = df[hd[0]].values
y1 = df[hd[1]].values

plt.rcParams["font.family"] = "DejaVu serif"
plt.rcParams["font.size"] = 9

cm = 1/2.54
fig, axs = plt.subplots(2, 2, figsize=(14*cm,9*cm),dpi=600,layout='constrained')
axs[0,0].hoge

axs[0,0].tick_params(which="both",direction="in")
axs[0,0].tick_params(left=True,right=True,top=True,bottom=True)

axs[0,0].set(xlabel='hoge [hoge]')
axs[0,0].set(ylabel='hoge [hoge]')

axs[0,0].set(xlim=[0,1])
axs[0,0].set(ylim=[0,1])

axs[0,0].plot(x1, y4, label="hoge1")

axs[0,0].legend(loc='upper left', bbox_to_anchor=(0,1))

fig.savefig("hoge.pdf")
fig.savefig("hoge.png")
```