LoginSignup
2
8

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-04-13

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ファイルを読み込み

image.png

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

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」がお気に入りです。

2
8
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
2
8