前回「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 |
サンプル
コメントを見れば大体の使い方は分かると思います。
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
こんな感じでグラフが出力されます。