【Python】pandasというライブラリを使ってCSVファイルを読み込み、折れ線グラフを作成する。

pythonを使用してExcelファイルの操作を勉強しています。
本日の気づき(復習)は、CSVの読み込みとグラフ作成に関しての続きです。
pythonでExcelを操作するため、openpyxlというパッケージを使用しています。

```csvs:売上.csv
部門,１月,２月,３月
商品A,600,700,800
商品B,4100,3800,4500
商品C,2900,1800,3000
商品D,800,1000,1200
商品E,600,450,300
```

前回とほぼ同様、上記のようなCSVファイルを読み込み
(グラフの見易さ向上の為、少し数値を変更しました。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/3907fd42-b864-6355-f27a-fe0a65b53fe4.png)


この様な折れ線グラフを作り貼り付けたいです。

# LineChartオブジェクト

折れ線グラフ作成にはLineChartオブジェクトを使用します。
グラフの作成方法自体は棒グラフと同じですが
今回も気を付けるポイントがあります。

- 月ごとの売上金額を、折れ線グラフにする
- 売上金額は各数値を１０００倍する

正直、ネタが尽きてきたので、１０００倍は無理矢理付け足しました。

### 余談：openpyxlで使えるグラフ

- BarChart：棒グラフ
- PieChart：円グラフ
- LineChart：折れ線グラフ
- AreaChart：面グラフ
- BarChart3D：3D棒グラフ
- RadarChart：レーダーチャート
- BubbleChartバブルチャート
- DoughnutChartドーナツチャート

目的に合ったグラフを選ぶようにしたいですね。
使える使えないは別として
個人的には、レーダーチャートが好みです。

### グラフの参照データを、行/列で切り替え

```python
bar.add_data(Referenceオブジェクト, from_rows=True, titles_from_data=True)
```

今回も上記のように「from_rows=True」を記述して
グラフの参照データを、行/列で切り替えます。

### 売上金額を１０００倍する

```python
DataFrame[列名] *= 1000
```

pandasのDataFrameの機能を使い、列名を指定するとその列のデータを取得できるので
上記のように演算子を用いると計算も出来ちゃいます。
が、今回はすべての売上データ(１月～３月の売り上げが記載されている列)なので

```python
DataFrame[['１月', '２月', '３月']] *= 1000
```

と、記述してみました。
DataFrameの指定列にリストを入れ込んでみるイメージです。
すると、上手く動作してくれました。

でも、これあってるのかな？？？
if文で記述した方が良かったのでしょうか。
ちゃんと動いてるから、いいなかな？？？

# 最終的なコード

```python
import pandas as pd
from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference
from openpyxl.utils.dataframe import dataframe_to_rows

wb = Workbook()
ws = wb.active

# CSVファイル読込み
df = pd.read_csv('売上.csv', encoding='utf-8')

# 各売上数値を１０００倍
df[['１月', '２月', '３月']] *= 1000

for row in dataframe_to_rows(df, index=None, header=True):
    # データを１行ずつ追加
    ws.append(row)

# 折れ線グラフを選択
line = LineChart()

# 円グラフのスタイル設定
line.style = 10

# グラフのデータ範囲を設定
data = Reference(ws, min_col=1, min_row=2,
                 max_col=ws.max_column, max_row=ws.max_row)

# ラベルの範囲を設定
labels = Reference(ws, min_col=2, min_row=1, max_col=ws.max_column)

# グラフにデータを追加(参照方法を行列で切り替え)
line.add_data(data, from_rows=True, titles_from_data=True)

# 折れ線グラフのラベルを追加
line.set_categories(labels)

# 横軸タイトルを追加
line.x_axis.title = '月度'

# 縦軸タイトルを追加
line.y_axis.title = '売上高'

# グラフのタイトルを追加
line.title = '売上推移'

ws.add_chart(line, 'A9')
wb.save('部門別売上_折れ線グラフ.xlsx')

```

### 余談：line.styleの種類
pie.style同様、line.styleも
１～４８までの整数値を指定することでスタイルを変更できます
前回同様一覧表を作ってみました。

```python
import pandas as pd
from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference
from openpyxl.utils.dataframe import dataframe_to_rows

wb = Workbook()
ws = wb.active

# CSVファイル読込み
df = pd.read_csv('売上.csv', encoding='utf-8')

# 各売上数値を１０００倍
df[['１月', '２月', '３月']] *= 1000

for row in dataframe_to_rows(df, index=None, header=True):
    # データを１行ずつ追加
    ws.append(row)

for i in range(1, 49):
    line = LineChart()
    line.style = i
    data = Reference(ws, min_col=1, min_row=2,
                     max_col=ws.max_column, max_row=ws.max_row)
    labels = Reference(ws, min_col=2, min_row=1, max_col=ws.max_column)
    line.add_data(data, from_rows=True, titles_from_data=True)
    line.set_categories(labels)
    line.x_axis.title = '月度'
    line.y_axis.title = '売上高'
    line.title = F'{i}'

    ws.add_chart(line, f'A{(i-1)*16+9}')
wb.save('部門別売上_折れ線グラフ一覧.xlsx')
```

ただ、円グラフと違って色分けが同色のグラデーションだと見づらい・・・。

ここ数日グラフの作成ばかり勉強していたのですが
「見せ方」って、大事なんだな～と改めて感じる事が出来ました。

自己満足じゃなく相手が見てどう思うかを頭に入れながら
コードもデザインも作っていけるようになりたいですね。