LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-04-14

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

売上.csv
部門,1月,2月,3月
商品A,600,700,800
商品B,4100,3800,4500
商品C,2900,1800,3000
商品D,800,1000,1200
商品E,600,450,300

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

image.png

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

LineChartオブジェクト

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

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

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

余談:openpyxlで使えるグラフ

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

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

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

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

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

売上金額を1000倍する

DataFrame[列名] *= 1000

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

DataFrame[['1月', '2月', '3月']] *= 1000

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

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

最終的なコード

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')

# 各売上数値を1000倍
df[['1月', '2月', '3月']] *= 1000

for row in dataframe_to_rows(df, index=None, header=True):
    # データを1行ずつ追加
    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も
1~48までの整数値を指定することでスタイルを変更できます
前回同様一覧表を作ってみました。

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')

# 各売上数値を1000倍
df[['1月', '2月', '3月']] *= 1000

for row in dataframe_to_rows(df, index=None, header=True):
    # データを1行ずつ追加
    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')

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

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0