読者です 読者をやめる 読者になる 読者になる

WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

NumPy + Pandas + matplotlibでデータプロッティングしてみる

Python

今回のエンジニアブログを担当する藤岡です。

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化
matplotlibDataFrameを描画

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 

bar

複数のグラフを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のみでデータ可視化ができてしまうのは、個人的に嬉しいです。
今回紹介したグラフ以外にも、サンキーダイアグラムや、散布図等、様々なグラフの種類があります。
手軽に実装を行うことが可能なので、興味のある方は是非触ってみて下さい。