Plotlyとは?Pythonでインタラクティブなグラフを作る基本と使い方
Plotly(プロットリー)は、ズームやホバー、クリックに反応するインタラクティブなグラフをPythonで手軽に作れるオープンソースのライブラリです。読み方は「プロットリー」で、Web表示を前提とする点がMatplotlibとの最大の違いです。この記事では、Plotlyの概要と読み方、インストールから散布図・折れ線・ガントチャートを作る手順、そしてMatplotlibとの使い分けまでを、実際に動くコードとともに整理します。色指定やReact連携など具体的な作り込みはPlotlyの色(color)指定と使い方|Express・React・画像出力までで扱います。
まとめ:Plotlyの要点
- Plotly=Web向けインタラクティブ可視化ライブラリ。読み方は「プロットリー」、Python・R・JavaScriptなどから使える。
- 入口は高レベルAPIの
plotly.express(公式推奨)。px.scatterなど1行でグラフができる。 - 散布図は
px.scatter、折れ線はpx.line、ガントチャートはpx.timeline(旧create_ganttは非推奨)。 - 細かい制御が要るときだけ低レベルの
plotly.graph_objects(go.Figure)を使う。 - 静的な出版品質の図や超大量データはMatplotlib、探索・共有・ダッシュボードはPlotlyが向く。
以下で、定義・グラフ種類・導入手順・作図例・Matplotlibとの違いの順に見ていきます。
Plotlyとは何か:読み方と全体像
Plotlyはカナダ発のデータ可視化プロダクト群で、中核はJavaScript製のオープンソースライブラリplotly.jsです(plotly.jsは2012年頃からOSSとして公開されています)。Pythonから使うplotly.pyはこのplotly.jsのラッパーで、生成したグラフはHTMLとして書き出され、ブラウザ上でズーム・パン・ホバーなどの操作ができます。ライセンスはMITで、商用利用を含めて無料で使えます。
「Plotly」という語は、(1)Pythonライブラリplotly.py、(2)JavaScriptライブラリplotly.js、(3)Pythonでデータ分析Webアプリを作るフレームワークDash、の総称として使われます。この記事で「Plotly」と書く場合は、特記なければPythonライブラリを指します。
Plotlyの読み方と「何ができるか」
読み方は「プロットリー」です。できることを一言でいえば、コードで作ったグラフをそのまま操作可能なWebグラフにすることです。点にカーソルを合わせると値が出るホバー、範囲を囲んで拡大するズーム、凡例クリックで系列を出し入れする操作などが、追加実装なしで標準で付きます。データ探索、社内ダッシュボード、レポート共有のように「見せて触ってもらう」用途で効果を発揮します。
Plotlyで作れるグラフの種類
基本的な統計グラフから3D・地図まで幅広く、いずれもplotly.expressの関数1つに対応します。よく使うものを用途とともに示します。
| グラフ | Express関数 | 主な用途 |
|---|---|---|
| 散布図 | px.scatter | 2変数の相関・分布 |
| 折れ線 | px.line | 時系列の推移 |
| 棒グラフ | px.bar | カテゴリ比較 |
| ヒストグラム | px.histogram | 分布・度数 |
| 箱ひげ図 | px.box | ばらつき・外れ値 |
| ヒートマップ | px.imshow | 行列・密度 |
| 3D散布図 | px.scatter_3d | 3次元の分布 |
| 地図 | px.choropleth | 地理データの塗り分け |
| ガントチャート | px.timeline | 工程・日程の可視化 |
どのグラフも戻り値はFigureオブジェクトなので、作った後に色や軸ラベルを同じ書き方で調整できます。次章から実際にインストールして描いてみます。
Plotlyのインストールと最初のグラフ
必要なのはPython環境(3.8以上)とpipだけです。仮想環境を有効にした状態で次を実行します。
pip install plotly
# バージョン確認(2026年時点の最新は 6.9.0)
python -c "import plotly; print(plotly.__version__)"
インストールできたら、付属のサンプルデータで散布図を1枚描いてみます。fig.show()を呼ぶと、ブラウザ(またはJupyter)に操作可能なグラフが開きます。
import plotly.express as px
df = px.data.iris() # 付属のアヤメのサンプルデータ
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species")
fig.show()
これだけで、種類ごとに色分けされ、点にホバーすると値が出る散布図ができます。同じことを低レベルAPIで書くと数倍の記述量になるため、まずはplotly.expressから始めるのが公式にも推奨されています。
plotly.expressとgraph_objectsの違い・使い分け
Plotlyには書き方が2系統あります。判断基準はシンプルで、まずplotly.expressで書き、それで表現できない構成のときだけplotly.graph_objectsに降りるのが実務的です。
plotly.express(px):高レベル。1関数=1グラフで簡潔。データ探索・定型グラフはこれで足りる。plotly.graph_objects(go):低レベル。異なる種類のサブプロット併置や二軸グラフなど、pxで組みにくい構成を細かく制御できる。
graph_objectsで折れ線を作ると次のようになります。add_traceで系列を足し、update_layoutでタイトルや軸を設定する流れです。
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 1, 2], mode="lines+markers", name="売上"))
fig.update_layout(title="月次売上", xaxis_title="月", yaxis_title="金額")
fig.show()
散布図と折れ線グラフの作り方
Plotlyで検索されやすいのが散布図と折れ線です。どちらもplotly.expressの1行で描け、引数を足すだけで色分けやマーカー表示に対応できます。
散布図はcolorやsizeにカラム名を渡すと、その列の値で自動的に色や大きさが割り当てられます。
import plotly.express as px
df = px.data.iris()
fig = px.scatter(
df, x="sepal_width", y="sepal_length",
color="species", size="petal_length",
hover_data=["petal_width"], # ホバー時に追加表示する列
)
fig.show()
折れ線グラフはpx.lineを使い、markers=Trueで各データ点にマーカーを付けられます。時系列データの推移を見るのに向きます。
import plotly.express as px
df = px.data.gapminder().query("country == 'Japan'")
fig = px.line(df, x="year", y="gdpPercap", markers=True)
fig.show()
ホバー時の表示内容は上のようにhover_dataで列を足すのが基本です。表示のオン・オフや書式を細かく変えたい場合はhovertemplateで制御します。
ガントチャートの作り方(px.timeline)
Plotlyはプロジェクトの工程表(ガントチャート)も描けます。かつてはfigure_factory.create_gantt()が使われていましたが、現在はcreate_ganttは非推奨で、バージョン4.9以降に追加されたpx.timelineを使うのが公式の推奨です。古い記事のコードをそのまま使うとこの点でつまずくため、新規に作るならpx.timelineを選びます。
import plotly.express as px
import pandas as pd
tasks = pd.DataFrame([
dict(Task="要件定義", Start="2026-01-06", Finish="2026-01-17", Owner="企画"),
dict(Task="設計", Start="2026-01-20", Finish="2026-02-07", Owner="開発"),
dict(Task="実装", Start="2026-02-10", Finish="2026-03-13", Owner="開発"),
dict(Task="テスト", Start="2026-03-16", Finish="2026-03-27", Owner="QA"),
])
fig = px.timeline(tasks, x_start="Start", x_end="Finish", y="Task", color="Owner")
fig.update_yaxes(autorange="reversed") # タスクを上から順に並べる
fig.show()
x_startとx_endに開始・終了日を、yにタスク名を渡すだけで工程表になります。既定では下から並ぶため、update_yaxes(autorange="reversed")で上から時系列に並べ替えるのが定番の調整です。
PlotlyとMatplotlibの違いと使い分け
PythonのグラフといえばMatplotlibが定番ですが、Plotlyとは得意分野が異なります。両者は排他ではなく、目的で選ぶものです。
| 観点 | Plotly | Matplotlib |
|---|---|---|
| 操作性 | ズーム・ホバー標準対応 | 基本は静的画像 |
| 出力先 | Webブラウザ・HTML | PNG・PDF・SVG画像 |
| 記述量 | px関数で1行 | 数行〜 |
| 3D・地図 | 標準サポート | 追加ツールキットが必要 |
| 印刷・論文向け | 可(別途書き出し) | 得意 |
| ライセンス | MIT(無料) | PSFベース(無料) |
目安としては、データを触って探索する・Webで共有する・ダッシュボードに載せるならPlotly、論文や資料の静的な図を高い品質で仕上げるならMatplotlibです。
Plotlyを選ぶべきでない場面
Plotlyにも不得手があります。次のケースでは無理にPlotlyを使わない方が結果的に速くなります。
- 数万点を超える大量データの一括描画:ブラウザ側でDOM描画するため重くなりやすい。この場合はデータを間引くか、WebGL版のトレース(例:
px.scatterのrender_mode="webgl")を検討する。 - そのまま印刷・投稿する静的な図:出版品質の細かな体裁調整はMatplotlibの方が実績と資料が多い。
- 使い捨ての確認用グラフ:ブラウザを開くコストがかかるため、値をさっと見るだけなら静的ライブラリで十分。
逆に、他者に見せて操作してもらう前提なら、この後の作り込みはPlotlyの色(color)指定と使い方や、Webアプリ化するPython Dashに進むとスムーズです。
よくある質問(FAQ)
Plotlyの読み方は?
「プロットリー」と読みます。英語表記は Plotly で、社名・ライブラリ名として使われています。
Plotlyは無料で使えますか?
PythonライブラリのPlotlyはMITライセンスのオープンソースで、商用利用を含めて無料です。Dashも基本機能はオープンソースで無料で使えます(有料は運用向けの上位製品)。
plotly.expressとgraph_objectsはどちらを使うべき?
まず高レベルのplotly.expressを使い、二軸や種類の異なるサブプロット併置などpxで組みにくい構成のときだけplotly.graph_objectsに切り替えるのが実務的です。
ガントチャートはcreate_ganttで作りますか?
いいえ。figure_factory.create_gantt()は非推奨で、現在はpx.timelineを使います。開始日・終了日・タスク名を渡すだけで工程表になります。
BokehやDashとの違いは?
Bokehも同じくインタラクティブ可視化ライブラリで、大規模データのストリーミング表示などに強みがあります。DashはPlotlyのグラフを部品にしてデータ分析Webアプリを組むためのフレームワークで、単体グラフではなく画面全体を作りたいときに使います。