Pythonでデータの可視化を行う際に、インタラクティブかつ柔軟なグラフを作りたい場合、Plotly は非常に有効な選択肢です。
中でも、Plotly Expressは、見栄えの良いグラフをより簡単に作りたいようなケースに最適です。
本記事では、Plotly Expressの基本的なグラフの作成方法を、代表的な6種類のグラフを中心に解説していきます。
Plotly Expressとは
Plotly Expressは、Plotly の高レベルAPI(=提供される機能が大雑把で簡単に使えるAPI)にあたり、シンプルかつ直感的にグラフ作成が可能です。
一方、Plotly Graph Objectsと比較して、カスタマイズの自由度は限定的であり、複数軸やサブプロット(複数のグラフを1ページに並べる)などの複雑な構成も苦手としています。
Plotly ExpressとPlotly Graph Objectsの違いについて知りたい方は、以下の記事もどうぞ。
インストールと事前準備
Plotlyをインストールしていない場合は、pipでインストールしてください。
pip install plotly
Bash続いて、Plotly Expressをインポートします。
import plotly.express as px
Python事前準備として、今回使用するサンプルデータを準備します。
今回は、Plotlyに標準で用意されているtipsデータセットを使用します。
飲食店でのチップに関する情報で、カテゴリデータと数値データがバランス良く含まれており、様々なグラフに活用できます。
# サンプルデータの読み込み
df = px.data.tips()
df.head()
Pythontotal_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
主要なグラフの作成方法6選
ここでは、主要なグラフの作成方法を6つ紹介します。
① 棒グラフ(Bar)
基本構文
棒グラフの作成にはpx.bar()を使用します。
設定可能な主な引数は次の通りです。
主な引数の解説
- x / y:それぞれX軸・Y軸に使う列名を指定
- color:カテゴリ別に色分けする列名
- barmode:棒グラフの表示モード(group=横並び、stack=積み上げ)
- title:グラフのタイトル
- labels:軸や凡例に表示するラベル名を辞書形式で設定
具体例
それでは実際にグラフを作成してみましょう。
曜日別の売上の合計を集計し、グラフを表示します。
# 曜日ごとの売上(total_bill)を集計
sales_by_day = df.groupby('day')['total_bill'].sum().reset_index()
# グラフ作成
fig = px.bar(sales_by_day, x='day', y='total_bill')
fig.update_layout(title='曜日別の売上合計', xaxis_title='曜日', yaxis_title='売上')
fig.show()
Python棒グラフを見ると、特に週末の売り上げが高いことがわかります。
グラフを横並びで表示する
棒グラフでは複数のデータを一緒に表示することも可能です。
例えば、先ほどの曜日別の売上を、さらに男女別に集計し、グラフを表示することも可能です。
横並び・積み上げは引数のbarmodeを指定することで変更することができます。
まずは横並びのグラフを作成してみましょう。
# 性別・曜日別の売上合計を集計
sales_by_sex_and_day = (
df.groupby(['sex', 'day'], observed=True)['total_bill'].sum().reset_index()
)
# グラフ作成
fig = px.bar(
sales_by_sex_and_day,
x='day',
y='total_bill',
color='sex',
barmode='group', # 'group'で横並びに
title='性別・曜日別の売上合計',
labels={'day': '曜日', 'total_bill': '売上'},
)
fig.show()
Pythonグラフを積み上げで表示する
次に積み上げのグラフも作成してみましょう。
# グラフ作成
fig = px.bar(
sales_by_sex_and_day,
x='day',
y='total_bill',
color='sex',
barmode='stack', # 'stack'で積み上げに
title='性別・曜日別の売上合計',
labels={'day': '曜日', 'total_bill': '売上'},
)
fig.show()
Python男女別に集計した棒グラフを見ると、男性の売上の方が高いことがわかります。
男性の単価が高いのか、単に客数が多いのかはこれだけでは読み取れませんが、例えば、男女別の平均単価や客数の集計などを行えば、さらにデータの深堀も可能となるでしょう。
② 折れ線グラフ(Line)
基本構文
折れ線グラフの作成にはpx.line()を使用します。
設定可能な主な引数は次の通りです。
主な引数の解説
- x / y:それぞれX軸・Y軸に使う列名を指定
- color:カテゴリ別に色分けする列名
- markers:Trueで各点にマーカーを表示
- labels:軸や凡例に表示するラベル名を辞書形式で設定
具体例
それでは実際にグラフを作成してみましょう。
レコード順(日付がないため)の売上推移をマーカー付きで表示します。
# グラフ作成
fig = px.line(
df,
y='total_bill',
markers=True,
title='性別・曜日別の売上合計',
labels={'index': 'レコード番号', 'total_bill': '売上'},
)
fig.show()
Python単にレコード順に並べているため、ここから何かを読み取ることは難しいですが、ほかの情報とのかけ合わせなどで、さらなる可視化も可能です。
③ 散布図(Scatter)
基本構文
散布図の作成にはpx.scatter()を使用します。
設定可能な主な引数は次の通りです。
主な引数の解説
- x / y:それぞれX軸・Y軸に使う列名を指定
- color:カテゴリ別に色分けする列名
- size:点の大きさを変える列(数値)
- hover_data:マウスホバー時に追加表示する列
- title:グラフのタイトル
- labels:軸や凡例に表示するラベル名を辞書形式で設定
具体例
それでは実際にグラフを作成してみましょう。
売上とチップをプロットし、関係性を可視化します。
# グラフ作成
fig = px.scatter(
df,
x='total_bill',
y='tip',
hover_data=['day', 'time'],
title='売上とチップの関係',
labels={'total_bill': '売上', 'tip': 'チップ'},
)
fig.show()
Python右肩上がりのプロットになっており、売上が上がるにつれて、チップの金額も上昇傾向にあることがわかります。
④ 円グラフ(Pie)
基本構文
円グラフの作成にはpx.pie()を使用します。
設定可能な主な引数は次の通りです。
主な引数の解説
- names:ラベル名に使う列
- values:割合の計算に使う数値列
- color:色分け用の列
- hole:0以上1以下でドーナツ化の度合いを指定
具体例
それでは実際にグラフを作成してみましょう。
曜日ごとの売上の割合を表示します(①と同じデータを使います)。
# グラフ作成
fig = px.pie(
sales_by_day,
names='day',
values='total_bill',
hole=0.5,
title='曜日別の売上構成比',
)
fig.show()
Python円グラフを見ると、特に週末の売上構成比が30%越えと高く、次点で木曜日が高いことがわかります。
⑤ 箱ひげ図(Box)
基本構文
箱ひげ図の作成にはpx.box()を使用します。
設定可能な主な引数は次の通りです。
主な引数の解説
- x / y:それぞれX軸・Y軸に使う列名を指定
- color:カテゴリ別に色分けする列名
- points:外れ値やデータ点の表示方法(
all
=全件表示) - labels:軸や凡例に表示するラベル名を辞書形式で設定
具体例
それでは実際にグラフを作成してみましょう。
曜日ごとの売上分布を表示します。
# グラフ作成
fig = px.box(
df,
x='day',
y='total_bill',
title='曜日別の売上分布(箱ひげ図)',
labels={'day': '曜日', 'total_bill': '売上'}
)
fig.show()
Python箱ひげ図は、長方形の「箱」とそこから伸びる「ひげ」が特徴のグラフで、データのばらつきを確認することができます。
①や④で週末の売上が大きいことを確認していましたが、金額のばらつきも大きいことがわかります。
⑥ ヒートマップ(Heatmap)
基本構文
ヒートマップの作成にはpx.density_heatmap()を使用します。
設定可能な主な引数は次の通りです。
主な引数の解説
- x / y:それぞれX軸・Y軸に使う列名を指定
- nbinsx / nbinsy:ビン(区切り)の数
- color_continuous_scale:カラーマップの種類
- labels:軸や凡例に表示するラベル名を辞書形式で設定
具体例
それでは実際にグラフを作成してみましょう。
売上とチップの密度をヒートマップで表示します(③をヒートマップで表現したもの)。
# グラフ作成
fig = px.density_heatmap(
df,
x='total_bill',
y='tip',
nbinsx=round(df['total_bill'].max() / 5),
nbinsy=round(df['tip'].max() / 2),
title='売上とチップの密度ヒートマップ',
labels={'total_bill': '売上', 'tip': 'チップ'}
)
fig.show()
Python売上を5刻み、チップを2刻みでヒートマップを作成してみましたが、売上:15超~25以下、チップ:2超~4以下とその周辺の色が黄色くなっており、密度(件数)が多いことがわかります。
その他のグラフ
Plotly Expressでは、ここまで紹介したグラフ以外にも、多彩なグラフを自由に構築できます。
- ツリーマップ:階層と割合を同時に可視化
- バブルチャート:散布図に量的なデータをプラスして可視化
- 地図グラフ:地図上で地理情報などを可視化
- 3Dグラフ:三次元グラフを可視化 など
様々なスタイルのグラフを比較的容易に作成することが可能です。
その他に作成可能なグラフについては、公式サイトにも掲載があるので、ぜひ参照してください。
まとめ
今回はPlotly Expressの基本的なグラフの作成方法について解説しました。
Plotly Expressは、インタラクティブなグラフを時間をかけずに作成したい場合に非常に有効なライブラリです。
まずはシンプルなグラフから試してみて、徐々にカスタマイズや高度なグラフにも挑戦してみてください。
また、同じグラフをPlotly Graph Objectsで作成する方法も解説していますので、そちらの記事もぜひご覧ください。