CSVファイルを読み込んで、指定した列名（複数）でグラフを描く

CSVファイルを読み込んでグラフ化する方法はいくつかありますが、ここでは Pandas と matplotlib を使う方法を紹介します。

関数化していますので、コピペの上、自由に解像してご利用ください。

# テストデータ

下記は本記事で使うサンプルデータです。

```
data1,data2,data3,data3
1,2,2,2
2,4,4,4
3,8,8,8
4,12,2,16
5,16,4,32
6,18,8,16
7,20,2,8
8,22,4,4
9,24,8,2
```

# CSVの指定列をグラフ化する最小サンプル
以下は、DataFrameに読み込んだCSVデータの1列目をX軸、2列目をY軸として、折れ線グラフを描画するサンプルです。
```python
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams

# CSVを読み込む（ファイルのパスはご自身の環境に合わせて修正してください）
csv = pd.read_csv("d:/test.csv") 

# グラフ化したいカラム名を取得する
x_name = csv.columns[0]
y_name = csv.columns[1]

# カラム名からデータを取得する
x = csv[x_name]
y = csv[y_name]

# グラフを描画する
plt.plot(x,y)

# 画面に表示する
plt.show()
```
実行すると下記のグラフが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775985/95c1d133-0077-93e2-9f93-5ac630ece3c5.png)

## 複数の列の値でグラフを描く
複数の折れ線を書きたい場合は、その数だけ plot() を繰り返して呼ぶことで実現できます。

下記はそれを関数化したもので、引数に指定された列の数だけ for ループを行い、グラフを描画しています。

ついでに、タイトルが日本語でも文字化けしないようにフォントを指定し、補助線／凡例の表示に対応しました。タイトルも指定できるようになっています。

このままコピペして使えます。

```python
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams

def chart(df,x_name,y_names,title="",x_title="",y_title=""):

    # --- グラフの体裁を整える ---
    rcParams['font.family'] = "Meiryo"     # matplotlibを日本語対応する 
    plt.grid()                             # 縦横の補助線を表示する
    plt.legend = True                      # 凡例を表示する
    plt.title(title)                       # グラフタイトルを設定する
    plt.xlabel(x_title)                    # X軸の名前を設定する
    plt.ylabel(y_title)                    # Y軸の名前を設定する

    # カラム名からデータを取得する
    x = csv[x_name]
    
    # カラム名の数だけグラフを作成
    for name in y_names:
        y = df[name]
        plt.plot(x,y,label="y_name")
```

この関数の使い方は次の通りです。第1引数にDataFrame、第2引数にX軸の値、第2引数にY軸の値を指定します。
おまけとして、第3引数にグラフタイトル、第4引数、第5引数に、X軸とY軸のタイトルを指定できるようにしました。

```python
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams

# CSVを読み込む
csv = pd.read_csv("p:/test.csv",encoding="shift-jis")

chart(csv,csv.columns[0],csv.columns[1:],"グラフ","X軸","Y軸")
# 画面に表示する
plt.show()
```
サンプルを実行すると、次のグラフが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775985/9db3d1ad-2a6a-a6a1-9a2e-43604dedb3ed.png)

## 折れ線と棒グラフを重ねたい
異なる種類のグラフを重ねたい場合、列名に応じてグラフの関数を使い分ける必要があります。べた書きだと簡単ですが、関数化する場合はどうやって指定するかを考える必要があります。

一番簡単なのは、棒グラフ用の引数を追加することなので、第6引数に棒グラフを描きたい列名を指定するようにしました。

```python
def chart(df,x_name,y_names,title="",x_title="",y_title="",y_bar=""):

    # --- グラフの体裁を整える ---
    rcParams['font.family'] = "Meiryo"     # matplotlibを日本語対応する 
    plt.grid()                             # 縦横の補助線を表示する
    plt.legend = True                      # 凡例を表示する
    plt.title(title)                       # グラフタイトルを設定する
    plt.xlabel(x_title)                    # X軸の名前を設定する
    plt.ylabel(y_title)                    # Y軸の名前を設定する

    # カラム名からデータを取得する
    x = csv[x_name]
    
    # カラム名の数だけグラフを作成
    for name in y_names:
        y = df[name]
        if name in y_bar:
            plt.bar(x,y,label="y_name")
        else:
            plt.plot(x,y,label="y_name")

```

下記は、2列目のデータのみ棒グラフ、その他は折れ線グラフを描画するサンプルです。

```python
# CSVを読み込む
csv = pd.read_csv("p:/test.csv",encoding="shift-jis")

chart(csv,csv.columns[0],csv.columns[1:],"グラフ","X軸","Y軸",csv.columns[2])
# 画面に表示する
plt.show()
```

下記は実行結果です。折れ線と棒グラフが同時に表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775985/d79afb5d-b4b8-88b4-b4bd-90f75b9d0082.png)

## まとめ
CSVファイルをグラフ化する場合、DataFrameを使うと処理が簡単になります。 DataFrame にもグラフ表示機能が付いていますが、あまり複雑なグラフは作成できません。

matplotlib を使えば、複数のグラフを並べて表示するなど、工夫次第で様々なことができますので、ちゃんとグラフを描きたい場合は、この方法がお勧めです。

もっと複雑は複合グラフ（重ね合わせ）を描きたい場合は、下記の記事が参考になります。

[【コピペOK】Matplotlibで簡単グラフ作成！自作ライブラリ「MultiChart」の使い方を解説](https://favorite-worlds.com/2024/08/10/%e3%80%90%e3%82%b3%e3%83%94%e3%83%9aok%e3%80%91matplotlib%e3%81%a7%e7%b0%a1%e5%8d%98%e3%82%b0%e3%83%a9%e3%83%95%e4%bd%9c%e6%88%90%ef%bc%81%e8%87%aa%e4%bd%9c%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9/)