Pythonでデータの可視化を行う際に、インタラクティブかつ柔軟なグラフを作りたい場合、Plotly は非常に有効な選択肢です。
中でも、Plotly Graph Objectsは、細かい表示調整や複雑なレイアウトが必要なケースに最適です。
本記事では、Plotly Graph Objectsの基本的なグラフの作成方法を、代表的な6種類のグラフを中心に解説していきます。
Plotly Graph Objectsとは
Plotly Graph Objects は、Plotly の低レベルAPI(=提供される機能が細かく、詳細な設定が必要なAPI)にあたり、細かいカスタマイズに対応したグラフ作成が可能です。
一方、Plotly Expressと比較して、グラフの要素(トレースやレイアウトなど)を記述する必要があることから、単純なグラフでもコード量が多くなる傾向があるため、やや学習コストは高いと言えるでしょう。
Plotly ExpressとPlotly Graph Objectsの違いについて知りたい方は、以下の記事もどうぞ。
インストールと事前準備
Plotlyをインストールしていない場合は、pipでインストールしてください。
pip install plotly
Bash続いて、Plotly Graph Objectsをインポートします。
import plotly.graph_objects as go
Python事前準備として、今回使用するサンプルデータを準備します。
今回は、Plotlyに標準で用意されているtipsデータセットを使用します。
飲食店でのチップに関する情報で、カテゴリデータと数値データがバランス良く含まれており、様々なグラフに活用できます。
import plotly.express as px
# サンプルデータの読み込み
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)
基本構文
棒グラフの作成にはgo.Bar()を使用します。
設定可能な主な引数は次の通りです。
主な引数の解説
- x / y:それぞれX軸・Y軸に使う列名を指定
- name:カテゴリ別に色分けする列名
- marker_color:色指定
- barmode:棒グラフの表示モード(group=横並び、stack=積み上げ)
- title:グラフのタイトル
具体例
それでは実際にグラフを作成してみましょう。
曜日別の売上の合計を集計し、グラフを表示します。
# 曜日ごとの売上(total_bill)を集計
sales_by_day = df.groupby('day')['total_bill'].sum().reset_index()
# グラフ作成
fig = go.Figure()
fig.add_trace(go.Bar(x=sales_by_day['day'], y=sales_by_day['total_bill']))
fig.update_layout(
title='曜日別の売上合計', xaxis_title='曜日', yaxis_title='売上'
)
fig.show()
Python棒グラフを見ると、特に週末の売り上げが高いことがわかります。
グラフを横並びで表示する
棒グラフでは複数のデータを一緒に表示することも可能です。
例えば、先ほどの曜日別の売上を、さらに男女別に集計し、グラフを表示することも可能です。
複数の系列を表示する場合はfig.add_trace()を繰り返して追加します(今回は性別で繰り返し)。
また、グラフの横並び・積み上げは引数のbarmodeを指定することで変更することができます。
まずは横並びのグラフを作成してみましょう。
# 性別・曜日別の売上合計を集計
sales_by_sex_and_day = (
df.groupby(['sex', 'day'], observed=True)['total_bill'].sum().reset_index()
)
# グラフ作成(性別ごとにtraceを作成)
fig = go.Figure()
for sex in sales_by_sex_and_day['sex'].unique():
subset = sales_by_sex_and_day[sales_by_sex_and_day['sex'] == sex]
fig.add_trace(go.Bar(x=subset['day'], y=subset['total_bill'], name=sex))
fig.update_layout(
title='性別・曜日別の売上合計',
xaxis_title='曜日',
yaxis_title='売上',
barmode='group', # 'group'で横並びに
)
fig.show()
Pythonグラフを積み上げで表示する
次に積み上げのグラフも作成してみましょう。
# グラフ作成(性別ごとにtraceを作成)
fig = go.Figure()
for sex in sales_by_sex_and_day['sex'].unique():
subset = sales_by_sex_and_day[sales_by_sex_and_day['sex'] == sex]
fig.add_trace(go.Bar(x=subset['day'], y=subset['total_bill'], name=sex))
fig.update_layout(
title='性別・曜日別の売上合計',
xaxis_title='曜日',
yaxis_title='売上',
barmode='stack', # 'stack'で積み上げに
)
fig.show()
Python男女別に集計した棒グラフを見ると、男性の売上の方が高いことがわかります。
男性の単価が高いのか、単に客数が多いのかはこれだけでは読み取れませんが、例えば、男女別の平均単価や客数の集計などを行えば、さらにデータの深堀も可能となるでしょう。
② 折れ線グラフ(Line)
基本構文
折れ線グラフの作成にはgo.Scatter()を使用します(後述の散布図と同じですが、引数のmodeで使い分けが可能です)。
設定可能な主な引数は次の通りです。
主な引数の解説
- x / y:それぞれX軸・Y軸に使う列名を指定
- mode:表示モード(
lines
=折れ線、markers
=点、lines+markers
=両方) - text:マウスホバー時に表示する補足情報
- name:凡例に表示する系列名
- line_color / marker:線やマーカーのデザイン
具体例
それでは実際にグラフを作成してみましょう。
レコード順(日付がないため)の売上推移をマーカー付きの折れ線グラフ(mode=’lines+markers’)で表示します。
# グラフ作成
fig = go.Figure()
fig.add_trace(go.Scatter(y=df['total_bill'], mode='lines+markers', name='売上'))
fig.update_layout(
title='売上の推移(レコード順)',
xaxis_title='レコード番号',
yaxis_title='売上',
)
fig.show()
Python単にレコード順に並べているため、ここから何かを読み取ることは難しいですが、ほかの情報とのかけ合わせなどで、さらなる可視化も可能です。
③ 散布図(Scatter)
基本構文
散布図の作成にも折れ線グラフと同じgo.Scatter()使用します。
※設定可能な引数は折れ線グラフと同じなため、省略します。
具体例
それでは実際にグラフを作成してみましょう。
売上とチップをプロットし、関係性を可視化します(mode=’markers’)。
# グラフ作成
fig = go.Figure()
fig.add_trace(go.Scatter(x=df['total_bill'], y=df['tip'], mode='markers'))
fig.update_layout(
title='売上とチップの関係',
xaxis_title='売上',
yaxis_title='チップ',
)
fig.show()
Python右肩上がりのプロットになっており、売上が上がるにつれて、チップの金額も上昇傾向にあることがわかります。
④ 円グラフ(Pie)
基本構文
円グラフの作成にはgo.Pie()を使用します。
設定可能な主な引数は次の通りです。
主な引数の解説
- labels:ラベル名に使うデータ
- values:割合の計算に使う数値データ
- hole:0以上1以下を指定するとドーナツ型に
- marker_colors:色の指定
具体例
それでは実際にグラフを作成してみましょう。
曜日ごとの売上の割合を表示します(①と同じデータを使います)。
# グラフ作成
fig = go.Figure()
fig.add_trace(
go.Pie(labels=sales_by_day['day'], values=sales_by_day['total_bill'], hole=0.5)
)
fig.update_layout(title='曜日別の売上構成比')
fig.show()
Python円グラフを見ると、特に週末の売上構成比が30%越えと高く、次点で木曜日が高いことがわかります。
⑤ 箱ひげ図(Box)
基本構文
箱ひげ図の作成にはgo.Box()を使用します。
設定可能な主な引数は次の通りです。
主な引数の解説
- x / y:それぞれX軸・Y軸に使うデータ
- name:系列名(凡例に表示)
- boxpoints:外れ値やデータ点の表示方法(
all
=全件表示) - marker_color:色指定
具体例
それでは実際にグラフを作成してみましょう。
曜日ごとの売上分布を表示します。
# グラフ作成
fig = go.Figure()
fig.add_trace(go.Box(x=df['day'], y=df['total_bill'], name='売上分布'))
fig.update_layout(
title='曜日別の売上分布(箱ひげ図)', xaxis_title='曜日', yaxis_title='売上'
)
fig.show()
Python箱ひげ図は、長方形の「箱」とそこから伸びる「ひげ」が特徴のグラフで、データのばらつきを確認することができます。
①や④で週末の売上が大きいことを確認していましたが、金額のばらつきも大きいことがわかります。
⑥ ヒートマップ(Heatmap)
基本構文
ヒートマップの作成にはgo.Heatmap()を使用します。
設定可能な主な引数は次の通りです。
主な引数の解説
- z:色で表現する数値データ(2次元配列)
- x / y:横軸・縦軸のラベル
- colorscale:カラーマップの種類
- colorbar:カラーバー(凡例)の設定
具体例
それでは実際にグラフを作成してみましょう。
売上とチップの密度をヒートマップで表示します(③をヒートマップで表現したもの)。
import numpy as np
import pandas as pd
# bin化して頻度をカウント
tip_bins = np.arange(0, df['tip'].max() + 2, 2)
bill_bins = np.arange(0, df['total_bill'].max() + 5, 5)
heatmap_data = df.copy()
heatmap_data['tip_bin'] = pd.cut(df['tip'], bins=tip_bins)
heatmap_data['bill_bin'] = pd.cut(df['total_bill'], bins=bill_bins)
heatmap_counts = (
heatmap_data.groupby(['tip_bin', 'bill_bin'], observed=True)
.size()
.unstack(fill_value=0)
)
# グラフ作成
fig = go.Figure()
fig.add_trace(
go.Heatmap(
z=heatmap_counts.values,
x=heatmap_counts.columns.astype(str),
y=heatmap_counts.index.astype(str),
)
)
fig.update_layout(
title='売上とチップの密度ヒートマップ',
xaxis_title='売上',
yaxis_title='チップ',
)
fig.show()
Python売上を5刻み、チップを2刻みでヒートマップを作成してみましたが、売上:15超~25以下、チップ:2超~4以下とその周辺の色が黄色くなっており、密度(件数)が多いことがわかります。
その他のグラフ
Plotly Graph Objects では、ここまで紹介したグラフ以外にも、多彩なグラフを自由に構築できます。
- ツリーマップ:階層と割合を同時に可視化
- バブルチャート:散布図に量的なデータをプラスして可視化
- 地図グラフ:地図上で地理情報などを可視化
- 3Dグラフ:三次元グラフを可視化 など
様々なスタイルのグラフを比較的容易に作成することが可能です。
その他に作成可能なグラフについては、公式サイトにも掲載があるので、ぜひ参照してください。
まとめ
今回はPlotly Graph Objectsの基本的なグラフの作成方法について解説しました。
Plotly Graph Objects は、インタラクティブなグラフを細かく制御したい場合に非常に有効なライブラリです。
コード量は多くなりますが、Plotly Expressでは物足りなくなった方や、細かいディテールを追求したい方などは、ぜひPlotly Graph Objectsにもチャレンジしてみてください。
また、同じグラフをPlotly Expressで作成する方法も解説していますので、そちらの記事もぜひご覧ください。