🍙

インタラクティブなグラフ作成ライブラリ Plotly

2024/12/28に公開

Plotlyとは

Plotlyとは、インタラクティブ(グラフを作成した後にユーザが描画範囲等を変更できる)なグラフを簡単に作成できるライブラリです。グラフ作成では、matplotlibseabornが有名ですが、これらは一度作ると描画範囲を変更するのにプログラムの再実行が必要であるため、情報共有の際に手戻りが発生することがありました。

Plotlyを使う嬉しさ

  • 描画範囲や表示する凡例を後から変更できる
  • フォントを設定しなくても日本語が文字化けしない
  • html形式で保存すれば、誰でも自由にインタラクティブなグラフを作成できる

Plotlyを使う嬉しさはここら辺になるのですが、この説明だけだとピンと来ないと思いますので、一度公式サイトにて埋め込まれているグラフを触ってみてください。下図のような感じで凡例を消したり、描画範囲を変更したりできます。

Matplotlibの場合

サンプルコードとして、農林水産省が公開している食料自給率のデータを使って折れ線グラフを作成してみました。

import os

import matplotlib.pyplot as plt
import pandas as pd

if __name__ == "__main__":
    # スクリプトのディレクトリに移動
    os.chdir(os.path.dirname(__file__))
    # フォントファミリーをMS Gothicに設定(日本語表示用)
    plt.rcParams["font.family"] = "MS Gothic"

    # データを読み込み
    df = pd.read_excel("../data/DataSet.xlsx")
    # グラフのサイズを設定して図とaxesオブジェクトを作成
    fig, ax = plt.subplots(figsize=(15, 8))

    # 「西暦」列を除いた全ての列に対してプロットを作成
    cols = df.drop(["西暦"], axis=1).columns
    for col in cols:
        ax.plot(df["西暦"], df[col], label=col, marker=".")

    # グラフのタイトルと軸ラベルを設定
    ax.set_title("食料自給率")
    ax.set_xlabel("西暦")
    ax.set_ylabel("自給率(%)")
    # X軸のラベルを90度回転
    ax.tick_params(axis="x", rotation=90)
    # 凡例を表示
    ax.legend()
    # グラフを表示
    plt.show()

出力結果

Plotlyの場合

import os

import pandas as pd
import plotly.graph_objects as go

if __name__ == "__main__":
    # スクリプトのディレクトリに移動
    os.chdir(os.path.dirname(__file__))

    # データを読み込み
    df = pd.read_excel("../data/DataSet.xlsx")

    # Plotlyのグラフオブジェクトを初期化
    fig = go.Figure()

    # 「西暦」列を除いた全ての列に対してプロットを作成
    cols = df.drop(["西暦"], axis=1).columns
    for col in cols:
        # 折れ線グラフとマーカーを追加(西暦をX軸、各項目の値をY軸)
        fig.add_trace(go.Scatter(x=df["西暦"], y=df[col], mode="lines+markers", name=col))

    # グラフのレイアウト設定
    fig.update_layout(
        title="食料自給率",  # グラフタイトル
        xaxis_title="西暦",  # X軸ラベル
        yaxis_title="自給率(%)",  # Y軸ラベル
        xaxis=dict(tickangle=90),  # X軸ラベルを90度回転
        legend_title="項目",  # 凡例タイトル
        # font=dict(family="MS Gothic"),  # フォント設定(無くても文字化けしない)
        width=1200,  # グラフの幅
        height=600,  # グラフの高さ
    )

    # グラフの表示
    fig.show()
    # グラフをHTMLファイルとして保存
    fig.write_html("PlotlySample.html")

出力結果

Plotlyで大量のデータで散布図を作成する場合

データ容量の大きいものを描画するとPlotlyではカクカクすることがあり、ユーザビリティが低下することがあります。その際はこちらのページで紹介いただいているgo.Scatterglを使ってみてください。

MatplotlibをPlotlyで作り変える場合

matplotlibで既にグラフを作成している場合には、ChatGPTに「このコードをPlotlyで作り変えて」とお願いすると基本的なグラフであれば作り変えてくれますので是非ご活用ください。

Discussion