今回のエンジニアブログを担当する藤岡です。
D3.js等のデータ可視化ライブラリは沢山存在していますが、
このエントリでは、「NumPy + Pandas + matplotlib」でデータプロッティングを行います。
所謂データ分析ツールのフロントエンド側の処理を3つのライブラリで実装してみようかと思います。
「データ分析Python」と呼ばれるものですね。
NumPyとは?
NumPyは数値計算を効率的に行うためのPythonの拡張モジュールです。
多次元配列の扱いを簡単にしてくれたり、大規模な高水準の数学関数ライブラリを提供してくれます。
公式サイト: http://www.numpy.org/
Pandasとは?
Pythonのデータ分析ライブラリで、Rライクな機能を提供してくれるモジュールです。
データ操作の為のDataFrameオブジェクトや、データセットの整形、柔軟な変形機能を提供してくれます。
公式サイト: http://pandas.pydata.org/
matplotlibとは?
Pythonのグラフ描画ライブラリです。
描画エンジンの一つとしてAnti-Grain Geometry(AGG)という2Dレンダリングライブラリを使用しています。
公式サイト: http://matplotlib.org/
公式サイトには、膨大な数のサンプルが存在してます。
実行環境
今回の機能検証条件は以下の通りです。
・ Mac
・ Python 2.7.9
・ pyenv + pyenv virtualenvによる環境構築
pyenvとpyenv virtualenvは下記URLからインストール、設定を行ってください。
・ pyenv: https://github.com/yyuu/pyenv
・ pyenv virtualenv: https://github.com/yyuu/pyenv-virtualenv
また、依存ライブラリのインストールも忘れず行う必要があります。
$ pip install numpy pandas matplotlib
実装編
今回の実装では、3つのモジュールは以下のような役割を担っています。
ライブラリ | 用途 |
---|---|
NumPy | ランダムな多次元データを作成 |
Pandas | NumPyで生成した多次元データをDataFrame化 |
matplotlib | DataFrameを描画 |
1, 集合棒グラフ
script.pyファイルを作成し、以下の内容を実装します。
# -*- coding: utf-8 -*- import matplotlib matplotlib.use('tkagg') import matplotlib.pyplot as pyplot import numpy import pandas # 0 ~ 20までの値が入った、10 × 4の多次元配列を生成 param = numpy.random.randint(0, 20, (10, 4)) # 集合棒グラフのプロット # a要素、b要素、c要素、d要素を持った集合棒グラフをプロットしている # plot内のkind要素に引数を指定することで、グラフの種類を設定することができる df = pandas.DataFrame(param, columns=['a', 'b', 'c', 'd']) df.plot(kind='bar') # Figure上に描画 pyplot.show()
pythonコマンドで動作確認を行います。実行するとウィンドウが立ち上がり、グラフが描画されます。
$ python script.py
集合棒グラフの描画もたった数行のコードで実装出来ます。
matplotlibを扱う上で重要なのが以下の二行で、TkAggという描画ライブラリを指定し、描画を行っています。
import matplotlib matplotlib.use('tkagg')
matplotlibはデフォルトではグラフ描画用の画面がない前提で動作をする為、エラーが出るか、スクリプトを実行しても何も表示されません。
ですので、matplotlib.use関数で描画ライブラリを指定しておく必要があります。
matplotlib.use関数を呼び出す場合は、matplotlib.pyplotをimportする前に実行する必要があります。
今回はスクリプト実行時にウィンドウが立ち上がりグラフの描画が行われるよう、TkAggを設定しています。
※ TkAgg ... Tk canvasを使用したAnti-Grain Geometryのこと。Python等の動的言語の為のグラフィカルユーザーインターフェースのことを示します。
2, 積み上げ棒グラフ + 折れ線グラフ
script2.pyファイルを作成し、以下の内容を実装します。
# -*- coding: utf-8 -*- import matplotlib matplotlib.use('tkagg') import matplotlib.pyplot as pyplot import numpy import pandas # 0 ~ 20のいずれかの値が入った、20 × 4の行列を生成 param = numpy.random.randint(0, 20, (20, 4)) # 積み上げ棒グラフのプロット df = pandas.DataFrame(param, columns=['a', 'b', 'c', 'd']) ax = df.plot(kind='bar', stacked=True, legend=False) # 折れ線グラフのプロット df2 = pandas.DataFrame(param, columns=['a', 'b', 'c', 'd']) df2.plot(ax=ax, stacked=True, legend=False) # Figure上に描画 pyplot.show()
先ほど同様、pythonコマンドで動作確認を行います。
$ python script2.py
複数のグラフを1つに纏めて描画することも可能です。
二つめのDataFrameを生成している際に指定している、axという要素が重要です。
上記の例だと、ax要素に積み上げ棒グラフのプロットオブジェクトを渡すことで、折れ線グラフと同一のエリア上でプロットしています。
# 積み上げ棒グラフのプロット df = pandas.DataFrame(param, columns=['a', 'b', 'c', 'd']) ax = df.plot(kind='bar', stacked=True, legend=False) # プロットしたDataFrameオブジェクトを変数に格納している # 折れ線グラフのプロット df2 = pandas.DataFrame(param, columns=['a', 'b', 'c', 'd']) df2.plot(ax=ax, stacked=True, legend=False) # ax要素を指定することで、DataFrameオブジェクト同士が同一画面上に描画される
Pythonのみでデータ可視化ができてしまうのは、個人的に嬉しいです。
今回紹介したグラフ以外にも、サンキーダイアグラムや、散布図等、様々なグラフの種類があります。
手軽に実装を行うことが可能なので、興味のある方は是非触ってみて下さい。