こんにちは、皆さん Jupyterなどでデータ分析をやっているときにグラフの作成は何を使っていますか?Matplotlibや Seabornがすぐに思い浮かぶと思いますが、散布図を書いたときに外れ値が原因で見たい領域が全然見えなかったり、軸で切り分けてみるときにいちいち元データを整形しないといけなかったり…
本来であればデータの構造を理解するために頭と時間を使いたいのにデータ可視化の時点で手間取ってしまい、効率が落ちてしまうことはよくあると思います。
そこで、登場するのがデータ可視化ライブラリである「Plotly」です。これは、Pythonだけでなく R, Julia, Javascriptなどでも使えるグラフを作るためのライブラリです。今回はこの Plotlyを使ってお手軽に色々な種類のグラフを作ってみました。
Plotlyとは
Plotlyはインタラクティブなグラフやチャートを生成できるライブラリです(公式ページ)。Pythonで使用するときには大きく分けて二種類のクラスメソッドがあります。
- plotly.express : pandas.DataFrameを使って、短いコードでグラフを作成
- plotly.graph_objects : listlikeなデータを使って、詳細まで明示したグラフを作成
plotly.expressではとりあえずグラフを見てみたいときに使うイメージで、plotly.graph_objectsは細かい部分までグラフを作りこむときに使うイメージです。
plotly.graph_objectsは Matplotlibや Seabornよりも複雑で習熟にそこそこなコストがかかりそうですが、plotly.expressは簡単にグラフが書け(体感 Seabornに似ています)かなりインタラクティブにグラフを操作することができます。今回はこの plotly.expressに絞ってコードをどんなグラフができるかを書いていきます。
インストール
pip で入ります
pip install plotly
condaで入れるときにはチャネルが「plotly」であることに注意してください
conda install -c plotly plotly
使用データ
今回使用したデータはTableauのサンプルデータとしてよく使われるスーパーストアの日本バージョンのものを使用しました。
URL: https://drive.google.com/drive/u/0/folders/1kXSb3fqPTt3VcPjGUSgOmrztlRfvvpMH
少し整形して、このようなデータを使って可視化しています。
基本系
大枠の出力方法は、pandas.DataFrameを指定してx軸とy軸に使うカラムを指定、色を分けたい場合はcolorに分析軸のカラムを指定します。
このようにして作られたグラフはグラフ内をドラッグすることによって表示する軸の範囲を変更できます。また、右側の要素をクリックするとその要素を表示するかどうかを選択することができます。他にもスライダーで表示させる要素を切り替えられたり、色々な操作性を組み込むことができます。以下コード例と出力結果を並べるので色々触ってみてください。
散布図
import plotly.express as px
fig = px.scatter(
data_frame=df,
x='売上',
y='利益',
color='地域',
marginal_x='rug',
marginal_y='rug',
title='Scatter Plot'
)
fig.show()
バブルチャート
import plotly.express as px
fig = px.scatter(
data_frame=df,
x='売上',
y='利益',
color='出荷モード',
size='数量',
title='Bubble chart'
)
fig.show()
折れ線グラフ
import plotly.express as px
fig = px.line(
data_frame=df,
x='オーダー日',
y='利益',
color='カテゴリ',
animation_frame='オーダー日(年)',
title='Line Plot'
)
fig.show()
棒グラフ
※集計された積み上げ棒グラフを作成するのは histogram関数を使う必要があります
import plotly.express as px
fig = px.histogram(
data_frame=df,
x='地域',
y='売上',
color='顧客区分',
title='Bar plot (by use Histogram)'
)
fig.show()
比較
円グラフ
import plotly.express as px
fig = px.pie(
data_frame=df,
values='売上',
names='カテゴリ',
title='Pie Chart'
)
fig.show()
サンバースト
import plotly.express as px
fig = px.sunburst(
data_frame=df,
values='売上',
path=['カテゴリ', 'サブカテゴリ'],
color='利益',
title='Sunburst Chart'
)
fig.show()
ツリーマップ
import plotly.express as px
fig = px.treemap(
data_frame=df,
values='売上',
path=['国', '地域', '都道府県'],
color='利益',
title='Treemap',
)
fig.show()
散布図行列
import plotly.express as px
fig = px.scatter_matrix(
data_frame=df,
dimensions=['売上', '利益', '数量', '割引率'],
color='顧客区分',
title='3D Scatter plot'
)
fig.show()
Parallel Coodinates
import plotly.express as px
fig = px.parallel_coordinates(
data_frame=df,
color='利益',
dimensions=['数量', '割引率', '売上', '利益'],
color_continuous_scale=px.colors.diverging.Tealrose,
color_continuous_midpoint=2,
title='Parallel Coodinates'
)
fig.show()
分布
ヒストグラム(連続値)
import plotly.express as px
fig = px.histogram(
data_frame=df,
x='利益',
nbins=100,
title='Histogram (value)'
)
fig.show()
ヒストグラム(カテゴリ)
import plotly.express as px
fig = px.histogram(
data_frame=df,
x='オーダー日(月)',
title='Histogram (category)'
)
fig.show()
ボックスプロット
import plotly.express as px
fig = px.box(
data_frame=df,
x='オーダー日(月)',
y='利益',
title='Box plot'
)
fig.show()
バイオリンプロット
import plotly.express as px
fig = px.violin(
data_frame=df,
x='オーダー日(月)',
y='利益',
color='顧客区分',
title='Violin plot'
)
fig.show()
※y軸を0付近にすると見えます
ヒートマップ
import plotly.express as px
fig = px.density_heatmap(
data_frame=df,
x='オーダー日(年)',
y='オーダー日(月)',
z='利益',
title='Heatmap'
)
fig.show()
等高線
import plotly.express as px
fig = px.density_contour(
data_frame=df,
x='売上',
y='利益',
color='都道府県',
title='Density Contours'
)
fig.show()
※x軸、y軸を0付近にすると見えます
三次元
三次元散布図
import plotly.express as px
fig = px.scatter_3d(
data_frame=df,
x='売上',
y='利益',
z='割引率',
color='カテゴリ',
title='3D Scatter plot'
)
fig.show()
というわけで Plotlyで色々可視化してみました。少ないコード量で、脳死でもリッチなグラフを書けるのが最大の強みだと思います。ぜひ使ってみてください。
最後まで読んでいただきありがとうございました。