【Python可視化】Plotlyのgoとpxの違い!初心者でも迷わない使い分け

【Python可視化】Plotlyのgoとpxの違い!初心者でも迷わない使い分け

Pythonでデータ可視化を行う際、Plotlyはインタラクティブなグラフが作成できる強力なライブラリです。そのPlotlyには、主に plotly.graph_objects (go)plotly.express (px) の2つの方法でグラフを作成するアプローチがあります。しかし、「どちらを使えばいいの?」と迷う方も多いのではないでしょうか?

この記事では、gopx の違いを詳しく解説し、それぞれの使いどころを具体的なPythonコードを交えて説明します。


Plotlyのgo (plotly.graph_objects) とは?

plotly.graph_objects(略して go)は、細かくカスタマイズしたい場合に適した方法 です。
基本的に go.Figure オブジェクトを作成し、グラフの各要素(トレースやレイアウトなど)を手動で指定する 必要があります。

goを使うメリット

  • 詳細なカスタマイズが可能(軸、凡例、アニメーションなど)
  • 複数のトレース(系列)を組み合わせやすい
  • データの更新やインタラクティブ性を高めやすい

goを使うデメリット

  • コードが長くなりがち
  • 初心者にはやや扱いにくい

goの基本的な使い方(棒グラフ)

例えば、売上データを棒グラフで表示する場合、go を使うと以下のようなコードになります。

import plotly.graph_objects as go

# データ
categories = ["1月", "2月", "3月", "4月"]
sales = [300, 400, 350, 500]

# Figureオブジェクトを作成
fig = go.Figure()

# 棒グラフを追加
fig.add_trace(go.Bar(x=categories, y=sales, name="売上"))

# レイアウトのカスタマイズ
fig.update_layout(
    title="月別売上",
    xaxis_title="",
    yaxis_title="売上 (万円)",
    template="plotly_white"
)

# グラフを表示
fig.show()

このコードでは、go.Figure() を作成し、add_trace()棒グラフのデータを追加 しています。
さらに update_layout() を使って、タイトルや軸のラベルを設定しています。


Plotlyのpx (plotly.express) とは?

plotly.express(略して px)は、シンプルなコードで簡単にグラフを作成できる 方法です。
px では 1行でデータフレームからグラフを作成できる のが最大の特徴です。

pxを使うメリット

  • コードが短く、直感的に書ける
  • データフレームと親和性が高い
  • カラーマッピングやアニメーションが簡単

pxを使うデメリット

  • 詳細なカスタマイズは難しい
  • 複数のトレース(系列)を扱うのがやや面倒

pxの基本的な使い方(棒グラフ)

同じ売上データを px で表現すると、以下のようになります。

import plotly.express as px
import pandas as pd

# データをPandasのDataFrameで用意
df = pd.DataFrame({"": ["1月", "2月", "3月", "4月"], "売上": [300, 400, 350, 500]})

# pxで棒グラフを作成(1行で完結)
fig = px.bar(df, x="", y="売上", title="月別売上", labels={"売上": "売上 (万円)"}, template="plotly_white")

# グラフを表示
fig.show()

このように、たった 1行go で作成したのとほぼ同じグラフが完成します。
px.bar()データフレームをそのまま指定 できるのが px の強みです。


goとpxの比較まとめ

比較項目go (graph_objects)px (express)
コード量多い(細かく書く必要あり)少ない(1行でグラフが作れる)
カスタマイズ性高い(細かい調整が可能)低め(基本設定のみ)
複数データの扱いやすさ扱いやすいやや難しい
データフレームとの相性普通(手動でデータを設定)高い(Pandasと連携しやすい)
初心者向け難しい簡単

goとpxの使い分け

「どちらを使えばいいの?」と迷った場合、以下の基準で選ぶと良いでしょう。

シンプルなグラフを素早く作りたい → px(plotly.express)

  • データフレームをそのまま使いたい
  • コードを短く書きたい
  • 軽くデータを可視化するだけならOK

細かくカスタマイズしたい → go(plotly.graph_objects)

  • 軸の設定や凡例の調整をしたい
  • 複数のデータセットを組み合わせたい
  • インタラクティブな操作を作り込みたい

例えば、データの探索(EDA)をサクッとしたいなら px を使い、ダッシュボードの本番環境では go を使う、という使い分けもよくあります。


具体的なシナリオで比較

📊 シナリオ1:1つの折れ線グラフを作る

例えば、2024年の売上推移を可視化するとします。

px なら1行で完結

df = pd.DataFrame({"": ["1月", "2月", "3月", "4月"], "売上": [300, 400, 350, 500]})
fig = px.line(df, x="", y="売上", title="2024年 売上推移")
fig.show()

go なら詳細設定が可能

fig = go.Figure()
fig.add_trace(go.Scatter(x=["1月", "2月", "3月", "4月"], y=[300, 400, 350, 500], mode="lines+markers", name="売上"))
fig.update_layout(title="2024年 売上推移", xaxis_title="", yaxis_title="売上 (万円)")
fig.show()

📈 シナリオ2:2つの系列を比較する

例えば、「売上」と「利益」の2つのデータを1つのグラフで表示したい場合。

go なら簡単に2系列を追加できる

fig = go.Figure()
fig.add_trace(go.Scatter(x=categories, y=sales, mode="lines", name="売上"))
fig.add_trace(go.Scatter(x=categories, y=[100, 200, 150, 300], mode="lines", name="利益"))
fig.show()

px だとデータを整形する必要がある

df = pd.DataFrame({"": ["1月", "2月", "3月", "4月"], "売上": sales, "利益": [100, 200, 150, 300]})
df_melted = df.melt(id_vars=[""], var_name="指標", value_name="")
fig = px.line(df_melted, x="", y="", color="指標", title="売上と利益")
fig.show()

まとめ

  • px はシンプルで使いやすい
  • go はカスタマイズ性が高い
  • データ分析なら px、本格的な可視化なら go

どちらも便利なので、用途に応じて適切に使い分けましょう!