見出し画像

Plotlyでデータを踊らせろ!: Z世代の視点からのエキサイティングなデータビジュアライゼーション

はじめに

こんにちは!
GA technologiesのAISCに所属しているマカンです。
Pythonでデータの可視化といえば何を思い浮かべますか。Matplotlibと言う人が数多くいると思います。Matplotlib以外Plotlyも優れている可視化ライブラリだと個人的に思います。
最近、DataScienceチームのミーティングでPlotlyが話題に上がり、その機能と利便性について軽く触れる機会がありました。これを機に、Plotlyについての理解を深め、その利点を共有するために、この記事を執筆することにしました。
Plotlyは、最近ではPythonでのデータ可視化の分野で急速に人気を集めているライブラリーです。特に私にとってはその洗練されたデザインやインタラクティブな機能が魅力的です。今回はそのPlotlyについて紹介します。


環境

本記事の可視化結果は、OS: macOS 13.5.2(M2)、Python 3.12.0の環境下で行っています。

入門

Plotlyのインストール

 condaの場合:

$ conda install -c plotly plotly=5.22.0

 condaではない場合:

$ pip install plotly==5.22.0

 5.22.0は現時点(2024-05-28)の最新バージョンです

基本的な利用方法は公式ページに記載しているので、こちらのページを参考にしてください

Plotly ExpressとPlotly Graph Objectsの比較

plotlyはプロット用に2つのインターフェースを提供しています。

import plotly.express as px
import plotly.graph_objects as go

この二つインターフェースの違いに関して、公式ドキュメントはこんな説明があります:

Any figure created in a single function call with Plotly Express could be created using graph objects alone, but with between 5 and 100 times more code.
Plotly Express provides more than 30 functions for creating different types of figures.

https://plotly.com/python/plotly-express/ (2024-05-28 最終閲覧)

The figures produced by Plotly Express can always be built from the ground up using graph objects, but this approach typically takes 5-100 lines of code rather than 1.

https://plotly.com/python/graph-objects/ (2024-05-28 最終閲覧)


つまり、Plotly Express は、簡潔な構文で高レベルのインタフェースを提供します。データの可視化に関する一般的なタスクを素早く実行できます。
Plotly Express を使用すると、グラフの種類を指定するための単一の関数呼び出しで簡単にプロットを作成できます。
プロットのカスタマイズやスタイルの微調整が必要な場合でも、比較的簡単に使えます。

Plotly Express と比較して、Plotly Graph Objects はグラフを作成するためにより多くのコードを書く必要がありますが、その分、より高度なカスタマイズが可能です。
Plotly Graph Objects を使用すると、図のレイアウトやスタイル、注釈の設定など、より詳細な機能を制御できます。

以下は3次元の可視化の例でgoモジュールとpxモジュールの違いを簡単に紹介します。

import numpy as np

# サンプルデータの作成
np.random.seed(0)
x = np.random.normal(size=100)
y = np.random.normal(size=100)
z = np.random.normal(size=100)

pxモジュール:

import plotly.express as px
import pandas as pd

# DataFrameに変換
data = {'x': x, 'y': y, 'z': z}
df = pd.DataFrame(data)

# 3D scatter plotを作成
fig = px.scatter_3d(df, x='x', y='y', z='z', title='3D Scatter Plot')

# レイアウト調整
fig.update_layout(
    scene=dict(
        xaxis_title='X軸のタイトル',
        yaxis_title='Y軸のタイトル',
        zaxis_title='Z軸のタイトル',
        xaxis=dict(range=[min(x), max(x)]),  # X軸の範囲をデータの最小値から最大値までに設定
        yaxis=dict(range=[min(y), max(y)]),  # Y軸の範囲をデータの最小値から最大値までに設定
        zaxis=dict(range=[min(z), max(z)])   # Z軸の範囲をデータの最小値から最大値までに設定
    ),
    width=800,  # 幅を800に設定
    height=800  # 高さを600に設定
)

# グラフを表示
fig.show()
pxモジュールで3D可視化をする結果

例えば、この可視化結果で「x<0 and y<0 and z<0のデータを点じゃなくてクロスにしたい、点のサイズを小さくしたい、かつz>1.5の部分を赤色にしたい」という場合には、より柔軟なカスタマイズができるgoモジュールを利用したほうが便利な場合があります。様々な書き方がありますが、例として以下のようにgoモジュールで書くことができます。

import plotly.graph_objects as go
import numpy as np

# データ生成
np.random.seed(0)
x = np.random.normal(size=100)
y = np.random.normal(size=100)
z = np.random.normal(size=100)

# 3D散布図のトレースを作成
fig = go.Figure()
color_labels = ['z > 1.5', 'z < 1.5']
color = ['red','blue']
value = [(x[z>1.5], y[z>1.5], z[z>1.5]),
         (x[z<1.5], y[z<1.5], z[z<1.5])]
for i, label in enumerate(color_labels):
    x_=value[i][0]
    y_=value[i][1] 
    z_=value[i][2] 
    symbol = np.where((x_ < 0) & (y_ < 0) & (z_ < 0), 'x', 'circle')
    fig.add_trace(go.Scatter3d(x=x_, 
                               y=y_, 
                               z=z_, 
                               mode='markers',
                               marker=dict(size=2, # 点群のサイズ
                                           symbol=symbol, # 点群の形状
                                           color=color[i], # 色
                                           opacity=0.8), # 透明度
                               name=label))
    
# レイアウト調整
fig.update_layout(
    title="3D Scatter Plot",
    scene=dict(
        xaxis_title='X軸のタイトル',
        yaxis_title='Y軸のタイトル',
        zaxis_title='Z軸のタイトル',
        xaxis=dict(range=[min(x), max(x)]),  # X軸の範囲をデータの最小値から最大値までに設定
        yaxis=dict(range=[min(y), max(y)]),  # Y軸の範囲をデータの最小値から最大値までに設定
        zaxis=dict(range=[min(z), max(z)])   # Z軸の範囲をデータの最小値から最大値までに設定
    ),
    width=800,  # 幅を800に設定
    height=800  # 高さを800に設定
)
    
# グラフを表示
fig.show()
goモジュールで3D可視化をする結果

二つの可視化結果を見ると、元々重なってしまった点群が見やすくなり、特にフォーカスして見たいz>1.5やx<0 and y<0 and z<0の部分を違う表現で目立たせました。

Plotlyと他のライブラリの比較

Plotyを使用してみて、Matplotlibなど他のライブラリと比較して、個人的に感じたメリットとデメリットを紹介します。

メリットについて

調べている中でメリットを感じたのは以下の2点があります。
1.複数のプログラミング言語のサポート:

Interactive charts and maps for Python, R, Julia, Javascript, ggplot2, F#, MATLAB®, and Dash.

https://plotly.com/graphing-libraries/ (2024-05-28 最終閲覧)

PlotlyはPythonだけでなく、他のプログラミング言語(R、JavaScriptなど)でも利用できます。
2. ダッシュボードを作れる:

PlotlyはDashというライブラリを使うことで、PythonでWebベースのダッシュボードを作成できます。これにより、データ分析や可視化の結果をリアルタイムで共有し、インタラクティブなダッシュボードを作成できます。

また実際に私が触った感想としては、以下の点もメリットだと感じました。

1. インタラクティブ性:
Plotlyは非常に強力なインタラクティブ性を提供します。グラフを拡大、縮小、回転、移動などの操作が可能です。マウスを散布図の点に移動すると、座標を確認できます。右上のラベルをクリックすると、クラスを非表示することもできます。

クラスを非表示


2. ウェブ上での表示:
Plotlyはウェブブラウザ上で直接表示できるため、データの可視化を共有しやすく、オンラインでの共同作業にも適しています。
3. デザインが綺麗で見やすい:
Plotlyはデフォルトのプロットでも綺麗で、見やすいデザインになっています。さまざまなカスタマイズオプションも提供されており、プロットを好みで調整できます。
4. 豊富な可視化機能:
Plotlyはさまざまな種類のプロットをサポートしており、2Dプロットから3Dプロット、地理情報システム(GIS)の可視化まで幅広く対応しています。また、アニメーションやカスタムインタラクティブな要素も簡単に追加できます。

デメリットについて

1. メモリ使用量
Plotlyは、大量のデータを処理する場合にメモリ使用量がMatplotlibと比べたら激しく増加しました。大規模なデータセットを扱う場合や、複数のインタラクティブなプロットを同時に表示する場合には、注意が必要かもしれません。
Plotlyは強力なインタラクティブ性を提供する一方で、他のライブラリと比べて処理速度が遅い場合があります。複雑なプロットを生成する場合には、処理時間が長くなる可能性があります。
2. 日本語ドキュメントが少ない:
Plotlyの機能は豊富ですが、多くの機能やオプションに関する日本語の情報が不足しているように感じました。特に新機能やアップデートに関する情報が十分でない場合があります。(2024年5月時点)

おわりに

今回はPlotlyについて簡単な説明をしました。Plotlyを使えば、Matplotlibと同じようなグラフを作成しつつも、マウスを使ってデータポイントをホバーしたり、クリックしたりすることで詳細な情報を表示したり、特定のデータを強調したりすることができます。しかし、これだけではないので、ぜひ今回紹介していない機能も活用してみてください。


この記事が気に入ったらサポートをしてみませんか?