箱ひげ図を作成する

Pythonで箱ひげ図を作成するサンプルです。

Excel 2016以降があればExcelで作ればよいと思いますが、Excel 2016以降が使えない場合に使う用のサンプルです。

最小限に近いサンプルでエラー処理は一切入っていません。

次のようなCSVファイルを処理します。

サンプルデータ

item1,48.7021286
item1,62.85817018
item1,53.12845154
item1,51.57406011
item1,42.24383899
item1,54.09353423
item1,58.92392502
item1,47.46597457
item1,42.25135512
(途中省略)
item3,76.1259415
item3,78.51593015
item3,73.75176458
item3,68.76502306
item3,71.77469834
item3,66.23458856
item3,61.62570566
item3,74.71465053
item3,70.19574588
item3,75.40084817
# 箱ひげ図を出力するサンプル
# 引数
#   1: データファイル名
#      データはCSV形式。1列目にキー、2列目に値
#   2: 出力画像ファイル名
#      省略時は画像保存しない
#
import sys
import csv
import matplotlib.pyplot as plt

filepath = sys.argv[1]
if len(sys.argv) >= 3:
    imagepath = sys.argv[2]
else:
    imagepath = ""

csv_data = {}

with open(filepath) as f:
    for row in csv.reader(f):
        key, value = row
        if key in csv_data:
            csv_data[key].append(float(value))
        else:
            csv_data[key] = [float(value)]

labels = sorted(csv_data.keys())
data = []
for key in labels:
    data.append(csv_data[key])

fig, ax = plt.subplots()

plt.boxplot(data, labels=labels)
plt.title('Box plot')
plt.xlabel('key')
plt.ylabel('value')

plt.show()

if imagepath != "":
    fig.savefig(imagepath)

プログラム実行例です。

> python boxplot1.py boxplot1.csv boxplot1.png

出力例

別の形式のサンプルデータ

data1,data2,data3
48.7021286,71.71807437,61.0765391
62.85817018,57.4644698,72.686287
53.12845154,58.69850286,68.08042994
51.57406011,63.70072526,80.19045869
42.24383899,61.77221538,68.97205104
54.09353423,44.46175396,67.83415337
58.92392502,66.4377553,74.13646321
47.46597457,42.68220272,69.17135643
(途中省略)
45.88584204,75.40529365,73.75176458
43.6036915,66.67519113,68.76502306
51.97166857,71.35200956,71.77469834
55.92280148,71.25710413,66.23458856
42.25102302,75.67283159,61.62570566
32.85473656,49.79542004,74.71465053
50.91361377,71.25025083,70.19574588
44.56056675,49.95660813,75.40084817
# 箱ひげ図を出力するサンプル
# 引数
#   1: データファイル名
#      データはCSV形式。1行目にキー、2行目以降に値
#   2: 出力画像ファイル名
#      省略時は画像保存しない
#
import sys
import csv
import matplotlib.pyplot as plt

filepath = sys.argv[1]
if len(sys.argv) >= 3:
    imagepath = sys.argv[2]
else:
    imagepath = ""

csv_data = {}
labels = []

with open(filepath) as f:
    reader = csv.reader(f)
    labels = next(reader)
    for label in labels:
        csv_data[label] = []
    for row in reader:
        for i, item in enumerate(row):
            if item != '':
                csv_data[labels[i]].append(float(item))

data = []
for key in labels:
    data.append(csv_data[key])

fig, ax = plt.subplots()

plt.boxplot(data, labels=labels)
plt.title('Box plot')
plt.xlabel('key')
plt.ylabel('value')

plt.show()

if imagepath != "":
    fig.savefig(imagepath)

プログラム実行例です。

> python boxplot2.py boxplot2.csv boxplot2.png

出力例