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


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

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

前回同様、上記のようなCSVファイルを読み込み

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

PieChartオブジェクト

円グラフ作成にはPieChartオブジェクトを使用します。
グラフの作成方法自体は棒グラフと同じですが

気を付けるポイントが2点あります。

  • 円グラフに表示する順番
  • 各データの割合表示

どちらも円グラフを作成する場合は大事なポイントだと思います。

円グラフに表示する順番

DataFrame.sort_values(by='ソートする項目', ascending=昇順はTrue,降順はFalse)

円グラフでデータを確認する場合は
占める割合の大きいものから順に表示したいので
CSVデータを張り付ける前にデータをソートしてしまいたいです。
そこで、上記のDataFrame.sort_valuesメソッドを使ってソートします。

各データの割合表示

pie.dataLabels = DataLabelList()
pie.dataLabels.showPercent = True

円グラフはデフォルトでは割合表示がされていないみたいです。
表示するためには、PieChartオブジェクトの
DataLabelList.showPercent属性をTrueにします。

最終的なコード

import pandas as pd
from openpyxl import Workbook
from openpyxl.chart import PieChart, Reference
from openpyxl.chart.label import DataLabelList
from openpyxl.utils.dataframe import dataframe_to_rows

wb = Workbook()
ws = wb.active

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

# データを降順でソート
df = df.sort_values(by='1月', ascending=False)
for row in dataframe_to_rows(df, index=None, header=True):
    # データを1行ずつ追加
    ws.append(row)

# 円グラフを選択
pie = PieChart()

# 円グラフのスタイル設定
pie.style = 2

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

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

# グラフにデータを追加
pie.add_data(data)

# 円グラフのラベルを追加
pie.set_categories(labels)

#割合をパーセント表示
pie.dataLabels = DataLabelList()
pie.dataLabels.showPercent = True

pie.title = '部門別売上'

# 棒グラフをシートに追加
ws.add_chart(pie, 'A9')

wb.save('部門別売上_円グラフ.xlsx')

何とかできました。ソートとかは使い勝手のいいメソッドなので
早めに知る事が出来て良かったです。

おまけ pie.styleの種類

pie.styleには、
1~48までの整数値を指定することでスタイルを変更できるのですが
一覧表みたいなものが見つけられませんでした。

ということで、上記の応用でこんなものを作りました。

import pandas as pd
from openpyxl import Workbook
from openpyxl.chart import PieChart, Reference
from openpyxl.chart.label import DataLabelList
from openpyxl.utils.dataframe import dataframe_to_rows

wb = Workbook()
ws = wb.active

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

# データを降順でソート
df = df.sort_values(by='1月', ascending=False)
for row in dataframe_to_rows(df, index=None, header=True):
    # データを1行ずつ追加
    ws.append(row)

for i in range(1, 49):
    pie = PieChart()
    pie.style = i
    data = Reference(ws, min_col=2, min_row=2, max_row=ws.max_row)
    labels = Reference(ws, min_col=1, min_row=2, max_row=ws.max_row)
    pie.add_data(data)
    pie.set_categories(labels)

    pie.dataLabels = DataLabelList()
    pie.dataLabels.showPercent = True
    pie.title = f'{i}'

    ws.add_chart(pie, f'A{(i-1)*16+9}')

wb.save('部門別売上_円グラフ一覧.xlsx')

試しに作ってみましたが、意外と面白いです。

個人的にはスタイル「10」がお気に入りです。