akiyoko blog

akiyoko の IT技術系ブログです

Pythonでヒストグラム

前回「PythonでExcel操作」の続きで、今回は、Excelから取得したデータを使ってPythonヒストグラムを描こうと思います。

matplotlib のインストール

グラフ描画のライブラリには、「matplotlib」を使います。

$ sudo easy_install matplotlib

matplotlib 1.2.1 がインストールされました。

ヒストグラム描画

matplotlibの使い方については、miyacdoorさんのサイト が本当に詳しいです。
大変参考になりました。


ヒストグラムを描画するには Axesクラスの hist() を使うのですが、パラメータが多過ぎて所見では分からないと思います。そこで、いろいろ試したなりに分かったことをまとめてみました。間違い等あれば教えてください。

hist(x, bins=10, range=None, normed=False, weights=None,
       cumulative=False, bottom=None, histtype='bar', align='mid',
       orientation='vertical', rwidth=None, log=False,
       color=None, label=None, stacked=False,
       **kwargs)

x: データ
bins: 棒の数(X方向の分割数)
range: X方向のデータ表示範囲
normed: 棒の高さの縮尺方法(Trueなら出現確率で表示、Falseならデータ数をそのまま表示)
cumulative: 累積表示にするかどうか(デフォルトはFalse)
facecolor: 棒の色('green', 'g', '#008000'などの色指定が可能 注1)
alpha: 棒の透過率

注1. 色指定は以下の略称が使用可能
b blue
g green
r red
c cyan
m magenta
y yellow
k black
w white
http://matplotlib.org/api/colors_api.html より)

サンプル

コメントを見れば大体の使い方は分かると思います。

test_histogram.py

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import numpy
import xlrd
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

if __name__ == '__main__':
    book = xlrd.open_workbook('/Users/akiyoko/Documents/temp/2nd_test.xls')
    sheet = book.sheet_by_name('Statistics (total score)')
    data = []
    for row in range(9, sheet.nrows):
        value = sheet.cell(row, 5).value
        if value != '':
            data.append(value)
    data = numpy.array(data)
    print 'data=%s' % data
    print 'size of data=%d' % len(data)
    mu = numpy.mean(data)
    print 'mean value=%.1f' % mu
    print 'median value=%.1f' % numpy.median(data)
    sigma = numpy.std(data)
    print 'standard deviation=%.2f' % sigma

    # 共通初期設定
    plt.rc('font', **{'family': 'serif'})
    # キャンバス
    fig = plt.figure()
    # プロット領域(1x1分割の1番目に領域を配置せよという意味)
    ax = fig.add_subplot(111)
    # ヒストグラム(normedをTrueで指定すると確率表示になる)
    ax.hist(data, bins=25, range=(0, 50), normed=False, facecolor='g', alpha=0.8)
    # X, Y方向の表示範囲
    ax.set_xlim(0, 50)
    ax.set_ylim(0, 20)
    # タイトル
    ax.set_title('Histogram', size=16)
    ax.set_xlabel('Score', size=14)
    ax.set_ylabel('Frequency', size=14)
    # 任意のテキスト($で囲むことでTeX表記も可能)
    ax.text(0, 17, r'''
        $\mu=%.1f$
        $\sigma=%.2f$''' % (mu, sigma))
    # グリッド表示
    ax.grid(True)
    # 平均値を示す線
    ax.axvline(x=mu, linewidth=1, color='r')
    plt.show()

実行結果

$ python test_histogram.py 
data=[ 42.  42.  40.  38.  38.  38.  38.  35.  35.  35.  35.  34.  34.  34.  34.
  33.  33.  33.  33.  32.  32.  32.  30.  30.  30.  30.  30.  30.  30.  30.
  29.  29.  29.  28.  28.  28.  28.  28.  27.  27.  27.  27.  27.  27.  26.
  26.  26.  26.  26.  26.  25.  24.  24.  24.  24.  23.  23.  23.  23.  23.
  23.  23.  23.  23.  22.  22.  22.  22.  22.  22.  22.  22.  21.  21.  20.
  20.  20.  20.  20.  19.  19.  19.  19.  19.  18.  18.  17.  17.  16.  16.
  16.  16.  15.  15.  15.  15.  14.  13.  13.  13.  13.  12.  12.  11.   9.]
size of data=105
mean value=24.9
median value=24.0
standard deviation=7.44

こんな感じでグラフが出力されます。
f:id:akiyoko:20130608203434p:plain