Up

帯グラフの描画

 

犬、猫、鳥の中から一番飼いたいペットを29人の人に聞いたところ、図1に示す結果が得られたとする。データがカテゴリごとの度数で与えられている場合は、本ウェブサイトの後半で説明する。

図1 Excelデータファイル(Individual.xlsx

 

第1列目に個人の識別用変数Personの値(数値でも文字列でもよい)、第2列目に選ばれたペットが設定されている。第1行目には変数名が書かれているので、データは2行目からである。

図1の形式のExcelデータファイルを読み込んで帯グラフを描くスクリプトをウェブサイト後半のリスト1に示す。スクリプトファイルとデータファイルは圧縮ファイルfilesbandgraph.zipにまとめたので、ダウンロード解凍すれば自由に利用できる。リスト1のスクリプトを実行すると、図2のダイアログウィンドウが表示される。

図2

 

図1のファイル名Individual.xlsxを設定して、「開く」ボタンをクリックすると、図3のダイアログウィンドウが表示される。

図3

 

帯グラフの描かれた画像を保存するファイル名を、ファイル拡張子が「.png」である適当な名前で設定する。図3では「MyFigure1.png」と設定されている。ファイル名を設定して「保存」ボタンをクリックすると、図4の帯グラフが表示される。

図4

 

リスト1において、帯グラフは次のコードで描かれている。

 

for nm, v in zip(Categ, counts):

    plt.barh(1, v, left = cum_pos, label = '{0}({1})'.format(nm, v))

    cum_pos += v

 

関数barhの引数は次の意味のものである。

 

.barh(1,                                  #  縦軸上の位置

 v,                                  #  帯の横幅

left = cum_pos,                     #  帯の左端の位置

label = '{0}({1})'.format(nm, v)    #  ラベル

)

 

 

 

リスト1 図1の形式のデータから帯グラフを描くスクリプト(BandInd.py

 

import tkinter as tk

import tkinter.filedialog as fd

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

 

def askinfilename(msg = None, types = [('', '*.*')]):

    """

            入力用ファイル名の設定

    """

    rt = tk.Tk()

    rt.withdraw()

    flnm = fd.askopenfilename(title = msg, filetypes = types)

    rt.destroy()

    return flnm

 

def askoutfilename(msg = None, types = [('', '*.*')], deftype = '.txt'):

    """

            出力用ファイル名の設定

    """

    rt = tk.Tk()

    rt.withdraw()

    flnm = fd.asksaveasfilename(title = msg, filetypes = types,

                                           defaultextension = deftype)

    rt.destroy()

    return flnm

 

 

finnm = askinfilename('入力データExcelファイル', types = [('Excel(*.xlsx)', '*.xlsx')])

foutnm = askoutfilename(msg = '画像保存ファイル', types = [('画像 (*.png)', '*.png')],

                       deftype = '.png')

 

xlsx_fl = pd.ExcelFile(finnm)

data_xlsx = pd.read_excel(xlsx_fl,  header = None)

data = data_xlsx.values

var_name = data[0,1]

values = data[1:].T[1]

Categ, counts = np.unique(values, return_counts = True)

print(Categ)

print(counts)

 

#       日本語表記の設定

plt.rcParams['font.family'] = ['Yu Gothic', 'Noto Sans CJK JP', 'Hiragino Maru Gothic Pro']

 

plt.figure(figsize = (8, 6))             #   画像のサイズ

cum_pos = 0

#       帯グラフの作成

for nm, v in zip(Categ, counts):

    plt.barh(1, v, left = cum_pos, label = '{0}({1})'.format(nm, v))

    cum_pos += v

plt.ylim(0, 2)                           #   縦軸の下限と上限

plt.yticks([])                           #   縦軸の目盛り無し

plt.xticks(fontsize = 18)                #   横軸の目盛り文字の大きさ

plt.yticks(fontsize = 12)                #   縦軸の目盛り文字の大きさ

plt.xlabel(var_name, fontsize = 20)      #   横軸の変数名

plt.legend()                             #   レジェンドの表示

plt.savefig(foutnm)                      #   画像の保存

plt.show()                               #   画像の表示

 

 

データがカテゴリごとの度数で与えられている場合

図1のデータが図5のようにカテゴリごとの度数で与えられているとする。

図5 ExcelデータファイルPooled.xlsx

 

図5では、1行目の1列目に変数名Petが書かれている。2行目にカテゴリ名、3行目にカテゴリの度数が設定されている。この形式のデータを入力ファイルとするスクリプトを本ウェブサイト後半のリスト2に示す。スクリプトファイルとデータファイルは圧縮ファイルfilesbandgraph.zipにまとめたので、ダウンロード解凍すれば自由に利用できる。

リスト2のスクリプトを実行すると図6のダイアログウィンドウが表示される。

図6

 

図5のファイル名を設定して、「開く」ボタンをクリックすると、図7のダイアログウィンドウが表示される。

図7

 

帯グラフの画像ファイルを保存するファイル名を、ファイル拡張子が「.png」である任意の名前で設定する。既にあるファイル名を設定すると上書き保存になる。

保存ファイル名を設定して「保存」ボタンをクリックすると、図8の帯グラフが表示される。

図8

 

リスト2において、帯グラフは次のコードで描かれている。

 

for nm, v in zip(Categ, counts):

    plt.barh(1, v, left = cum_pos, label = '{0}({1})'.format(nm, v))

    cum_pos += v

 

関数barhの引数は次の意味のものである。

 

.barh(1,                                  #  縦軸上の位置

 v,                                  #  帯の横幅

left = cum_pos,                     #  帯の左端の位置

label = '{0}({1})'.format(nm, v)    #  ラベル

)

 

 

リスト2 度数がカテゴリごとに集計されたデータの帯グラフ描画スクリプト(BandPooled.py

 

import tkinter as tk

import tkinter.filedialog as fd

import pandas as pd

import matplotlib.pyplot as plt

 

def askinfilename(msg = None, types = [('', '*.*')]):

    """

            入力用ファイル名の設定

    """

    rt = tk.Tk()

    rt.withdraw()

    flnm = fd.askopenfilename(title = msg, filetypes = types)

    rt.destroy()

    return flnm

 

def askoutfilename(msg = None, types = [('', '*.*')], deftype = '.txt'):

    """

            出力用ファイル名の設定

    """

    rt = tk.Tk()

    rt.withdraw()

    flnm = fd.asksaveasfilename(title = msg, filetypes = types,

                                           defaultextension = deftype)

    rt.destroy()

    return flnm

 

 

finnm = askinfilename('入力データExcelファイル', types = [('Excel(*.xlsx)', '*.xlsx')])

foutnm = askoutfilename(msg = '画像保存ファイル', types = [('画像 (*.png)', '*.png')],

                       deftype = '.png')

 

xlsx_fl = pd.ExcelFile(finnm)

data_xlsx = pd.read_excel(xlsx_fl,  header = None)

data = data_xlsx.values

 

VarName = data[0][0]

Categ = data[1]

counts = data[2]

 

#       日本語表記の設定

plt.rcParams['font.family'] = ['Yu Gothic', 'Noto Sans CJK JP', 'Hiragino Maru Gothic Pro']

 

plt.figure(figsize = (8, 6))             #   画像のサイズ

#       帯グラフの作成

cum_pos = 0

for nm, v in zip(Categ, counts):

    plt.barh(1, v, left = cum_pos, label = '{0}({1})'.format(nm, v))

    cum_pos += v

plt.ylim(0, 2)                           #   縦軸の下端と上端

plt.yticks([])                           #   縦軸の目盛りなし

plt.xticks(fontsize = 18)                #   横軸の目盛り文字の大きさ

plt.yticks(fontsize = 12)                #   縦軸の目盛り文字の大きさ

plt.xlabel(VarName, fontsize = 20)       #   横軸の変数名

plt.legend()                             #   レジェンドの表示

plt.savefig(foutnm)                      #   画像の保存

plt.show()                               #   画像の表示

 

 

Up