PythonでPlotlyに触れてみようかと

PythonでPlotlyに触れてみようかと

こんにちは。マスジュンです。

pythonのグラフ作成といえばmatplotが有名だと思いますが、最近、まわりでPlotlyを使う人が増えてきました。その人達がいうには、直感的にグラフが作成できるので使いやすいとのこと。というわけで、Plotlyでヒストグラムを作成してみて、使い勝手などを感じてみようと思います。

Advertisement

Plotlyとは

Plotlyは、カナダにあるRやPythonなどで利用できる作図ライブラリを提供している会社です。


プログラムが直感的でわかりやすく、JavaScriptをつかって動的できれいなグラフを作ってくれるようです。

Plotlyのインスール

今回はPythonで使ってみようと思います。先ずは、ターミナルからpipを使ってパッケージをインストールします。

 $ pip install plotly

無事にインスールできたら、ヒストグラムを例に基本的な作図を行ってみましょう。

plotlyでの作図

plotlyは、オンラインでAPIで利便性が向上します。しかし、ビジネスで使う場合は、データが外に漏れてしまう可能性があるので、今回はAPIを利用しないオフラインで作業を行っていきます。

パッケージの読み込み

先ずは、必要なライブラリを読み込みます。

import plotly.plotly as py #plotly
import plotly.graph_objs as go #グラフオブジェクトの作成
import plotly.offline as offline #オフライン用パッケージ
offline.init_notebook_mode(connected=False) #connectedがtrueの場合は、オンライン接続する。

テストデータ

今回は、テストデータとしておなじみにのirisを使います。

import seaborn as sns
iris=sns.load_dataset("iris")
iris.head()
   sepal_length    sepal_width petal_length    petal_width species
0   5.1 3.5 1.4 0.2 setosa
1   4.9 3.0 1.4 0.2 setosa
2   4.7 3.2 1.3 0.2 setosa
3   4.6 3.1 1.5 0.2 setosa
4   5.0 3.6 1.4 0.2 setosa

ヒストグラムの作図

sepal_lengthのヒストグラムを作図して、分布を確認してみます。
plotlyは作図するデータの部分と、タイトルや軸のレイアウト部分を記述して、最後に合わせて作図オブジェクを作成します。先ずは、データの方を定義します。

x_start = iris["sepal_length"].min()
x_end = iris["sepal_length"].max()

data = go.Histogram(
    x=iris["sepal_length"],
    xbins=dict(
    start=4,
    end=9,
    size=0.2)
)

たしかに、記述の仕方はわかりやすいですね。ちなみにxをyに変えると縦型のヒストグラムになります。その辺は近いうちに。

次にレイアウト部分を定義します。

layout = go.Layout(
    xaxis = dict(title="額の長さ"), 
    yaxis = dict(title="度数"),
    bargap = 0.1) # 棒の間隔

matplotのように対応フォントを設定しないでも、日本語が出力されます。地味に嬉しいですね。
では、このデータ定義とレイアウト定義を使って、グラフを描写してみます。

fig = dict(data=[data], layout=layout)
#offline.iplot(fig) #JSを利用した動的なグラフを作図
#このサーバーでは処理が重たいので出力しない

#画像としてダウンロード
offline.plot(
    fig, image_filename="histgram", image='png',
    image_height = 400, image_width = 600, auto_open = True)

#ダウンロードした画像を読み込み
from IPython.display import Image
Image('/Users/masujun/Downloads/histgram.png')

NewImage

オフラインでipythonに画像として出力するのは、結構面倒です。一度、画像としてダウンロードして、それを改めて読み込む。異なるページのブラウザが立ち上がるし、ダウンロードフォルダにファイルが増え続けます。さらに、なぜか「Unknown」というファイルも出来上がる。。。もっとスマートな方法があるようでしたら、ご教示いただけると幸いです。

【番外】plotlyのAPIを使って出力

冒頭でオンラインは使わないと言いましたが、PlotlyのAPIを使えば、画像出力の処理をスマートに行なえます。

plotlyのサイトから会員登録をして、[setting]から自身に割り当てられたログインIDAPIキーを取得します。

import plotly
plotly.tools.set_credentials_file(username='hogehoge',api_key='hogehogehoge')

画像としてipython上に組み込むには、下記のスクリプトを実行します。

py.image.ishow(fig)

NewImage

また、画像として保存する場合は以下になります。

py.image.save_as(fig, filename='./histgram.png')

この方法だと、ダウンロード先を適宜変更することが可能ですね。

最後に

plotlyは確かにスクリプトの記述がわかりやすく、Javascriptで動的にデータを確認できるので探索的に行う場合は良いですね。ただ、不満点としては、オフラインでの画像出力になります。この点はAPIを使えれば全く問題ないのですが、グラフの情報をAPIに投げていると思うので、ビジネスデータを使うのは不安ですね。自分は、とりあえずseaborneかな。jupy2wpでの投稿もできないので。。。

参考文献

Pythonカテゴリの最新記事