pythonを使用してExcelファイルの操作を勉強しています。
本日の気づき(復習)は、CSVの読み込みとグラフ作成に関しての続きです。
pythonでExcelを操作するため、openpyxlというパッケージを使用しています。
部門,1月,2月,3月
商品A,600,700,800
商品B,4100,3800,4500
商品C,2900,1800,3000
商品D,800,1000,1200
商品E,600,450,300
前回とほぼ同様、上記のようなCSVファイルを読み込み
(グラフの見易さ向上の為、少し数値を変更しました。)
この様な折れ線グラフを作り貼り付けたいです。
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')
ただ、円グラフと違って色分けが同色のグラデーションだと見づらい・・・。
ここ数日グラフの作成ばかり勉強していたのですが
「見せ方」って、大事なんだな~と改めて感じる事が出来ました。
自己満足じゃなく相手が見てどう思うかを頭に入れながら
コードもデザインも作っていけるようになりたいですね。