PlotlyはJavaScriptベースのPythonデータ可視化ライブラリで、インタラクティブでWebベースの可視化に重点を置いています。
高水準のAPIを持つSeabornのようなシンプルさと、Bokehのようなインタラクティブさを併せ持っています。
コアライブラリの機能性に加え、ビルトインのPlotly ExpressとDashを使用することで、通常Flaskで書かれるWebベースのアプリケーションやインタラクティブなデータ駆動型ダッシュボードにとって素晴らしい選択肢となります。
このガイドでは、PlotlyでBar Plotをプロットする方法を見ていきます。
棒グラフは、カテゴリデータを視覚化するために最も一般的に使用され、各棒の高さは、そのカテゴリの発生回数を表します。
Plotlyで棒グラフを描く
Plotlyで棒グラフを描くには、Plotly Express (px
) インスタンスの bar()
関数を呼び出し、x
と y
の引数に有効なデータを与えるだけでよい。
import plotly.express as px
x = ['Category 1', 'Category 2', 'Category 3']
y = [5, 3, 6]
fig = px.bar(x, y)
fig.show()
ここでは、3つのカテゴリをリストとして x
引数に与え、いくつかのスカラー値を y
引数に与えています。
この結果、シンプルで直感的な棒グラフが得られます。
しかし、データの可視化を行う際に、リストを扱うことはほとんどありません。
ここでは、Telecom Users Dataset をインポートして、 InternetService
と tenure
の特徴を棒グラフで可視化してみましょう。
InternetService特徴は、顧客が利用しているサービスの種類を指定するカテゴリ特徴であり、
tenure` 特徴は、顧客がどれくらいの期間、その会社に滞在しているかを月単位で表す数値特徴です。
import pandas as pd
import plotly.express as px
df = pd.read_csv('telecom_users.csv')
print(df.head())
という結果になります。
gender SeniorCitizen tenure InternetService ...
0 Male 0 72 No ...
1 Female 0 44 Fiber optic ...
2 Female 1 38 Fiber optic ...
3 Male 0 4 DSL ...
4 Male 0 2 DSL ...
さて、このデータを棒グラフにしてみましょう。
import pandas as pd
import plotly.express as px
df = pd.read_csv('telecom_users.csv')
fig = px.bar(df, x = 'InternetService', y = 'tenure')
fig.show()
データセットからデータをプロットするために、最初の引数にデータソース(df
)を、x
とy
の引数に可視化したいカラム名を指定しました。
Plotly はこれらをマップし、データを取得し、プロットを生成します。
さて、Plotlyによって生成されたプロットは、最初の例のような単純な1対1のマッピングとは異なり、いくつかの行が同じ x
値を共有しているので、実際にはそれぞれのインスタンスをこのプロット上でそれ自身の小さな積み上げ棒に分離しています。
このプロットでは、各インスタンスが顧客にサービスを提供した月数の累積を、並列に見ることができます。
9万ヶ月というと、7500年分の月数のように思えますが、中央値は29ヶ月です。
print(df['tenure'].median()) # 29.0
Plotlyで棒グラフの色を変更する
データセットに存在する他の変数に基づいて、前述の各インスタンスの色を変更することは簡単です。
これらは多くの場合、gender
や SeniorCitizen
などの他のカテゴリ的な特徴です。
他の特徴によってインスタンスをグループ化すると、グループ化された棒グラフが作成され、これらは最も一般的に隣り合わせにプロットされます。
インスタンスを別の素性で色分けすると、2つ以上のインスタンスのグループを重ね合わせることができるため、積み上げ型棒グラフになります。
もう一度、棒グラフをみてみましょう。
今度は、gender
の特徴によって、それぞれのグラフに色をつけてみましょう。
import pandas as pd
import plotly.express as px
df = pd.read_csv('telecom_users.csv')
fig = px.bar(df, x = 'InternetService', y = 'tenure', color='gender')
fig.show()
ここで、Plotlyのデフォルトのカラースキームが適用され、インスタンスは色ごとにソートされるので、プロット全体がごちゃごちゃになることはないでしょう。
同じ x
値を共有する複数の行があるので、これらは基本的に積み重ねられたグループ化された棒グラフとしてプロットされます。
もし、積み重ねない(他の特徴との二者択一ではない)別の特徴をプロットすると、プロットはかなり違って見えるでしょう。
import pandas as pd
import plotly.express as px
df = pd.read_csv('telecom_users.csv')
fig = px.bar(df, x='tenure', y='MonthlyCharges', color='tenure')
fig.show()
多くの色の値、例えば 0..70
を tenure
機能で提供すると、プロット上に美しいグラデーションが形成されます。
Plotlyでグループ化された棒グラフをプロットする。
棒グラフを重ねるのではなく、隣り合わせにプロットした方が区別しやすい場合があります。
これは、2つの値しか持たない SeniorCitizen
のようなバイナリ素性がある場合に特に有効です。
グループ化する素性は本当に n
個の値を持つことができますが、ほとんどのグループは大きすぎるとあまり役に立ちません。
そのためには、単純に Figure
のレイアウトを更新して、 barmode
を 'group'
に設定すればよいのです。
import pandas as pd
import plotly.express as px
df = pd.read_csv('telecom_users.csv')
fig = px.bar(df, x = 'InternetService', y = 'tenure', color='gender')
fig.update_layout(barmode='group')
fig.show()
これで、インスタンスの数を比較するのがより簡単になりました。
Plotlyで横棒グラフを描く
Plotly を使って棒グラフを水平にプロットするには、棒グラフのプロット時に orientation
引数を h
(デフォルトの v
とは異なる) に設定します。
import pandas as pd
import plotly.express as px
df = pd.read_csv('telecom_users.csv')
fig = px.bar(df, x='MonthlyCharges', y='tenure', color='tenure', orientation='h')
fig.show()
もし、X-Y関係を以前のように維持したい場合は、 x
と y
の引数を入れ替える必要があることを覚えておいてください。
このコードを実行すると、次のようになります。
Plotlyで棒グラフを並べる
Plotly は自動的にバーを並べます。
この設定は、Figure
パラメータを更新することで直接変更することができます。
手動順序、または自動順序を選択することができます。
手動で順序付けする場合は、 category_orders
引数に、特徴の名前とその順序を含む辞書を渡せば、固定順序になります。
import pandas as pd
import plotly.express as px
df = pd.read_csv('telecom_users.csv')
fig = px.bar(df, x='InternetService', y='tenure', color='gender',
category_orders={"InternetService": ["DSL", "Fiber optic", "No"],
"gender": ["Female", "Male"]})
fig.show()
ここでは、InternetService
機能と gender
機能を手動で設定した順序で並べました。
棒グラフをプロットすると、次のようになります。
また、特に多くの値が考えられる場合、Plotlyに自動的にソートさせ、特徴の値を並べ替えさせたいと思うかもしれません。
カテゴリのソートや数値のソートができます。
また、どちらも 昇順
や 降順
で並べ替えることができます。
数値順の場合は total
キーワードを、カテゴリ順の場合は category
キーワードを呼び出します。
デフォルトでは、Plotlyは提供されたデータに基づいて順序を調整します – この例では、total ascending
として順序付けされています。
これをtotal descending
に変更してみましょう。
fig.update_layout(xaxis={'categoryorder':'total descending'})
この結果は
カテゴリ順に並べた場合は、辞書順に並べ替えられます。
fig.update_layout(xaxis={'categoryorder':'category ascending'})
この結果は
結論
このチュートリアルでは、Plotly を使って棒グラフを描画し、カスタマイズする方法について簡単に見てきました。
もしあなたがデータ可視化に興味があり、何から始めたらよいかわからない場合は、Pythonでデータ可視化に関する私たちの本の束をチェックしてみてください。
Pythonによるデータ可視化
データビジュアライゼーションで危険な存在になる
30日間無条件返金保証
初級から上級まで
定期的に無料で更新(最新更新は2021年4月)
ボーナスリソースやガイドを更新
Pythonでデータ可視化 MatplotlibとPandasは、Pythonの基礎知識を持つ全くの初心者が、PandasとMatplotlibを使って、単純なプロットからインタラクティブなボタンを持つアニメーションの3Dプロットまで、これらのライブラリで高度な作業をするための強力な基盤を構築できるように設計された書籍です。
本書は、Pythonの基本的な知識を持つ方を対象としています。
PandasとMatplotlibについて知っておく必要があることすべてを教えてくれる、詳細なガイドです。
Pythonによるデータ可視化」は、Pythonの初級~中級開発者向けの書籍で、Pandasを使った簡単なデータ操作から、MatplotlibやSeabornなどのコアなプロットライブラリ、そしてAltairなどの宣言的・実験的ライブラリの活用方法までを案内しています。
具体的には、11章にわたって、9つのPythonライブラリを取り上げています。
Pandas、Matplotlib、Seaborn、Bokeh、Altair、Plotly、GGPlot、GeoPandas、そしてVisPyです。
データビジュアライゼーションのユニークで実用的なガイドとして、あなたがキャリアで使うかもしれない多くのツールを紹介しています。