KMDのプログラミングメモノート

主にUnity(C#)を中心としたプログラムの備忘録

Python Excelデータから棒グラフの描画(pandas, matplotlib)




概要

Excelから読み取ったデータを棒グラフとして描画するプログラムを紹介します。




注意

以下の例では次のExcelファイルを使用しています
(ファイル名:sample.xlsx、シート名:Sheet1)

A B C D E
1 名前 英語 数学 国語 合計
2 ボブ 100 52 58 210
3 エミリー 75 41 87 203
4 田中 90 87 91 268
5 スミス 42 82 43 167
6 山田 55 64 72 191




プログラム

#インポート
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams


#ファイルの読み込み
df = pd.read_excel('sample.xlsx', 'Sheet1')


#軸ラベルなどを日本語表記できるようにfontを変更
plt.rcParams['font.family'] = 'MS Gothic'

#fontサイズの変更
plt.rcParams['font.size'] = 14


#データの抽出
#名前の抽出
names = df['名前']

#得点の抽出
datas = {}
for i in range(1, len(df.columns)):
    datas[df.columns[i]] = df.iloc[ : , i]

#グラフの描画
fig = plt.figure(figsize = (12, 12))#描画領域の確保

# 余白を設定
plt.subplots_adjust(wspace=0.4, hspace=0.4)

i = 0
for key, value in datas.items():
    #描画領域の設定
    ax = fig.add_subplot(2, 2, i+1)
    
    #タイトル、軸の名前の設定
    ax.set_title(f'グラフ{i+1}:{key}')
    ax.set_xlabel('氏名')
    ax.set_ylabel('点数')
    
    #縦軸の範囲を決定
    if i < 3:
        ax.set_ylim(0, 100)
    else:
        ax.set_ylim(0, 300)
    
    #描画
    ax.bar(names, value)
    
    i+=1


実行結果




プログラムの解説

インポート

  • importによって、pandasとmatplotlib.pyplotをインポートします。
  • また、matplotlibからncParamsをインポートしていますが、これはグラフに表示する文字などのフォントを設定するために使用します。
#インポート
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams




エクセルファイルの読み込み

  • pandasのread_excel('ファイルのパス', 'シート名')を使うことで指定したシートを読み込むことができます。
  • 今回はpyファイルとエクセルファイルが同じフォルダにあるため、ファイル名のみを指定しています。
  • 取得したデータはDataFrame型で保存されます。
#ファイルの読み込み
df = pd.read_excel('sample.xlsx', 'Sheet1')




軸ラベルなどの設定

  • インポートした'rcParams'を変更することにより軸ラベルなどのフォントを変更しています。
  • 今回は日本語表示に対応するためフォントをMS Gothicに、また標準のサイズでは少し小さかったためフォントサイズを変更しています。
#ファイルの読み込み
#軸ラベルなどを日本語表記できるようにfontを変更
plt.rcParams['font.family'] = 'MS Gothic'

#fontサイズの変更
plt.rcParams['font.size'] = 14




データの抽出①

  • まず、取得したDataFrame型変数dfから名前を取得します。このとき変数namesには名前の列の要素(ボブ~山田)が格納されます。
#データの抽出
#名前(ボブ、エミリー、…)の抽出
names = df['名前']




データの抽出②

  • データから各科目+合計点を取得します。
  • for文ではiを1~df.columns(データの列数)-1と変化させています。ここではdf.columnsは5であるので、iは1~4と増加していきます。
  • for文内では「科目名をkey、その科目におけるボブ~山田の得点をvalue」とdict(辞書型変数)を作成します。
  • df.columns[i]はi番目の列名(0なら「名前」、1なら「英語」)を指しているので、iの取る範囲から「英語」~「合計」と変化していきます。
  • df.iloc[ : , i]の処理でi列目のすべてのデータを取得しています。
#得点の抽出
datas = {}
for i in range(1, len(df.columns)):
    datas[df.columns[i]] = df.iloc[ : , i]




グラフの描画準備

  • 1つ目の処理でグラフの描画領域を確保しています。また、2つ目の処理でグラフの余白の幅を設定しています。
#グラフの描画
fig = plt.figure(figsize = (12, 12))#描画領域の確保

# 余白を設定
plt.subplots_adjust(wspace=0.4, hspace=0.4)




グラフの描画

  • for文により科目ごと、および合計点のグラフを表示します。
  • ax = fig.add_subplot(2, 2, i+1)では先ほど確保したグラフ領域を分割して、その分割した領域のどこにグラフを描画するか指定します。
  • 分割については第1引数が縦方向の分割数、第2引数が横方向の分割数を示しており、この例では縦・横それぞれ2分割して合計で4つの領域に分割しています。ちなみに、fig.add_subplot(1, 4, i+1)とした場合は横方向に4分割されるので下の図のようにそれぞれのグラフが横に並びます。
  • 第3引数では分割した領域のどこにグラフを描画するかを番号で指定します。番号と領域の対応は下の図を参考にしてください。
  • 縦軸の範囲を決定して各科目については最大値を100、合計については300とすることでグラフを見やすくしています。
  • ax.barにより棒グラフを描画しています。
i = 0
for key, value in datas.items():
    #描画領域の設定
    ax = fig.add_subplot(2, 2, i+1)
    
    #タイトル、軸の名前の設定
    ax.set_title(f'グラフ{i+1}:{key}')
    ax.set_xlabel('氏名')
    ax.set_ylabel('点数')
    
    #縦軸の範囲を決定
    if i < 3:
        ax.set_ylim(0, 100)
    else:
        ax.set_ylim(0, 300)
    
    #描画
    ax.bar(names, value)
    
    i+=1


fig.add_subplot(1, 4, i+1)とした場合のグラフ

fig.add_subplot(1, 4, i+1)における第3引数と描画領域の対応