はじめに
プロジェクト管理において、全体のスケジュール感や進捗を一目で把握できるガントチャートは有用なツールです。Python の Plotly を使うと、Excel のスクリーンショットのような静止画ではなく、マウスオーバーで詳細を表示したり期間を拡大縮小したりできる、対話的なガントチャートを作成できます。
一方で、いざ Python でチャートを作ろうとすると、コードを書く前のタスクデータ(CSV など)を用意する作業が手間になりがちです。日付をテキストで 1 つずつ入力したりフォーマットを整えたりするのは、意外と時間のかかる作業です。そこで本記事では、古い書き方(figure_factory)ではなく、現在の主流である Plotly Express と Pandas を組み合わせた方法を紹介します。
- Plotly Express を使った、短くシンプルなガントチャート作成コード
- Pandas で Excel / CSV からデータを読み込む方法
- 計画と実績を重ねる予実管理と、進捗率による色分けのカスタマイズ
- Plotly・Matplotlib・python-gantt など、手法ごとの使い分け
Plotly Express のpx.timeline関数を使うと、数行のコードで対話的なガントチャートを作成できます。データ入力は Excel に任せて Pandas で読み込む構成にすると、タスクの追加・更新が容易になります。さらに後半では、計画と実績を重ねる予実管理の実装と、用途に応じた他手法との使い分けまで解説します。
Plotly Express を選ぶ理由
Plotly は、Python・R・JavaScript などに対応したオープンソースのデータ可視化ライブラリです。データサイエンス分野で広く使われており、作成したグラフが Web ブラウザ上で対話的に動作する点が特徴です。
Python のグラフ描画では Matplotlib も広く使われますが、ガントチャートの用途では Plotly に次の利点があります。
拡大・縮小(ズーム)に対応する
Matplotlib は静止画(PNG 画像など)として出力されるため、長期のプロジェクトを表示すると文字が潰れたり詳細が見えにくくなったりします。一方 Plotly では、マウス操作で特定の期間をズームしたり横にスクロールしたりできます。全体の流れと直近の細かい予定を 1 つのグラフで両立できる点が強みです。
マウスオーバーで詳細を表示する(ツールチップ)
Matplotlib ではすべての情報をグラフ上に文字として配置する必要があり、情報量が増えると見づらくなります。Plotly では、タスクのバーにマウスを乗せたときだけ、開始日・終了日・担当者・進捗率などの詳細をポップアップ表示できます。見た目を簡潔に保ちつつ、必要な情報を埋め込めます。
Web との親和性が高い
作成したグラフは HTML ファイルとして保存できるため、ブラウザがあれば Python 環境がない相手の PC でも閲覧できます。チームへの共有もしやすい形式です。
なお、ガントチャート作成の歴史的経緯として、以前はfigure_factoryのcreate_gantt関数が使われていました。現在はpx.timelineが標準で、公式リファレンスでもcreate_ganttは非推奨(px.timelineの利用を推奨)と明記されています。本記事執筆時点の Plotly は 6.x 系まで進んでおり、いずれのバージョンでもpx.timelineが推奨される方法です。
参考: Gantt charts in Python(Plotly 公式)
“Prior to the introduction of plotly.express.timeline() in version 4.9, the recommended way … was to use the now-deprecated create_gantt() figure factory”
(バージョン 4.9 で px.timeline が導入される前は、現在は非推奨の create_gantt() を使うのが推奨されていました。)
https://plotly.com/python/gantt/
環境準備とライブラリ
Python でガントチャートを作成するため、次の 3 つのライブラリをインストールします。Pandas と openpyxl を組み合わせる点がポイントです。
- plotly: 対話的なグラフを描画する主役のライブラリ
- pandas: Excel や CSV データを整形するためのデータ分析ライブラリ
- openpyxl: Pandas が Excel ファイル(.xlsx)を読み込む際に内部で使うライブラリ(Excel 連携で必要)
ターミナル(Mac)またはコマンドプロンプト(Windows)で、次のコマンドを実行します。
pip install plotly pandas openpyxlJupyter Notebook や Google Colab を使う場合は、コードセルの先頭に!pip install ...と入力して実行すればインストールできます。
Plotly Express でガントチャートを作成する
まずは最小構成のコードです。現在の Plotly では、plotly.expressモジュールのpx.timeline関数を使うと、数行でガントチャートを作成できます。
import plotly.express as px
import pandas as pd
# 1. データ準備
df = pd.DataFrame([
dict(Task="要件定義", Start="2026-04-01", Finish="2026-04-05"),
dict(Task="設計", Start="2026-04-05", Finish="2026-04-15"),
dict(Task="実装", Start="2026-04-15", Finish="2026-04-30"),
])
# 2. ガントチャート作成
fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task")
# Y 軸の並び順を反転させる(指定しないと下から順に並ぶ)
fig.update_yaxes(autorange="reversed")
# 3. 表示
fig.show()このコードだけで、マウスを乗せると日付が表示され、ズーム操作も可能なガントチャートが描画されます。update_yaxes(autorange="reversed")を入れている理由は、px.timelineが既定では下から順にタスクを並べるためで、これを反転して上から順に表示しています。

タスクデータの準備を効率化する
ガントチャートをコードで作る際、手間になりやすいのがタスクデータの準備です。これまでの手法では、テキストエディタで次のようなデータを手入力する必要がありました。
要件定義, 2026-04-01, 2026-04-05, 50この方法では、日付のフォーマットを誤ったりカンマを抜かしたりしてエラーになりがちです。そこで本記事では、データ管理を Excel(または Google スプレッドシート)に任せ、Python から直接読み込む方法をおすすめします。
- 入力が速い: Excel ならオートフィルで日付を一気に入力できる
- 型変換が自動: Pandas の
read_excelは Excel の日付を日付型として認識するため、文字列のパース処理を書かずに済む - 予実管理が容易: 「計画」と「実績」の列を用意しておけば、比較チャートも生成しやすい
Excel での管理イメージ
次の形式で Excel を作成し、tasks.xlsxとして保存します。日付列は短い日付形式(yyyy/m/d)に設定しておくと、Pandas が日付型として読み込みやすくなります。
| タスク | フェーズ | 計画開始 | 計画完了 | 実績開始 | 実績完了 | 進捗率 |
|---|---|---|---|---|---|---|
| 要件定義 | 企画 | 2026/4/1 | 2026/4/5 | 2026/4/1 | 2026/4/6 | 100 |
| 設計 | 設計 | 2026/4/5 | 2026/4/15 | 2026/4/6 | 2026/4/18 | 100 |
| 実装 | 開発 | 2026/4/15 | 2026/4/30 | 2026/4/18 | 40 |
Excel を読み込んでチャート化する
まずは Excel を読み込み、計画どおりに進んだ場合のスケジュールを表示します。難しい加工はせず、読み込むだけのコードです。
import plotly.express as px
import pandas as pd
# 1. Excel ファイルを読み込む(スクリプトと同じフォルダに配置)
df = pd.read_excel("tasks.xlsx")
# 2. ガントチャート作成(基本形)
# Excel の列名(計画開始・計画完了)を指定する
fig = px.timeline(df, x_start="計画開始", x_end="計画完了", y="タスク")
# Y 軸の並び順を反転させる(上から順に表示)
fig.update_yaxes(autorange="reversed")
# 3. 表示
fig.show()これで、タスクが増えたら Excel に追記してスクリプトを再実行する、というサイクルでスケジュールを管理できます。
なお、Plotly はブラウザ上でグラフを描画するため、日本語の表示は描画環境のフォントに依存します。Matplotlib の静止画出力で起きる日本語の文字化け(豆腐表示)とは事情が異なり、fontにシステムフォントを指定すれば日本語を表示できます。フォント指定は次のデザイン調整のコードで扱います。
予実管理と進捗の色分け(カスタマイズ)
基本表示ができたら、プロジェクト管理で重要な予実管理(計画と実績の比較)と、進捗率に応じた色分けを行います。ここでは、計画をグレーの斜線、実績を青のグラデーションで表現し、両者を重ね合わせて表示します。
import plotly.express as px
import pandas as pd
import os
import webbrowser
# 1. データ読み込み(日付列は短い日付形式 yyyy/m/d を推奨)
df = pd.read_excel("tasks.xlsx")
# --- データを加工 ---
# (A) 計画データ(背景用: グレー斜線)
df_plan = df[["タスク", "計画開始", "計画完了", "フェーズ"]].copy()
df_plan = df_plan.rename(columns={"計画開始": "Start", "計画完了": "Finish"})
df_plan["種別"] = "計画"
# (B) 実績データ(主役用: 青グラデーション)
df_act = df[["タスク", "実績開始", "実績完了", "フェーズ", "進捗率"]].copy()
df_act = df_act.rename(columns={"実績開始": "Start", "実績完了": "Finish"})
df_act = df_act.dropna(subset=["Start", "Finish"]) # 未着手は除外
df_act["種別"] = "実績"
df_act["進捗表示"] = df_act["進捗率"].astype(str) + "%"
# 2. チャート作成
# (1) ベースとなる実績(青グラデーション)を作成
fig = px.timeline(
df_act,
x_start="Start",
x_end="Finish",
y="タスク",
color="進捗率", # 進捗率で濃淡をつける
range_color=[0, 100], # 0% が薄い、100% が濃い
color_continuous_scale="Blues", # 青の単色グラデーション
text="進捗表示", # バー上に % を表示
hover_data=["フェーズ", "進捗率", "Start", "Finish"],
opacity=1.0,
)
# (2) 背景となる計画(グレー斜線)を作成
fig_plan = px.timeline(
df_plan,
x_start="Start",
x_end="Finish",
y="タスク",
color_discrete_sequence=["#d9d9d9"], # 薄いグレー
opacity=0.5,
)
# 計画バーに斜線を入れる
fig_plan.update_traces(marker_pattern_shape="/", marker_pattern_size=5, marker_pattern_solidity=0.3)
# 計画バーをメインの図に追加する
for trace in fig_plan.data:
fig.add_trace(trace)
# 3. デザイン調整
fig.update_layout(
title="プロジェクト予実管理表(斜線: 計画 / 塗潰し: 実績)",
font=dict(family="Meiryo, Yu Gothic, sans-serif"), # 日本語フォントを指定
coloraxis_colorbar=dict(
title="進捗率",
tickvals=[0, 50, 100],
ticktext=["0%(未)", "50%", "100%(完)"],
),
legend=dict(traceorder="reversed"),
)
# Y 軸を反転(上から順に表示)
fig.update_yaxes(autorange="reversed")
# X 軸を日本語表記に
fig.update_xaxes(tickformat="%Y年%m月%d日")
# バーの文字位置を調整
fig.update_traces(textposition="auto")
# 4. 保存と表示
filename = "gantt_chart_final.html"
fig.write_html(filename)
print(f"予実管理チャートを '{filename}' として保存しました。")
webbrowser.open("file://" + os.path.realpath(filename))カスタマイズのポイント
予実の可視化では、グレーの斜線が当初の計画を、青の塗潰しが実際の実績を表します。この 2 つを重ねることで、計画よりバーが伸びている(遅延)か、計画より早く終わった(前倒し)かを把握しやすくなります。
青の濃淡は進捗率を表し、濃い紺色(100%)が完了したタスク、薄い水色(0〜20%)が開始直後または停滞しているタスクを示します。color_continuous_scaleやrange_colorを変えれば、配色やしきい値を調整できます。
px.timeline の制約として知っておきたい点
px.timelineはシンプルに扱える一方、旧create_ganttにあった一部の引数を備えていません。たとえば、同名タスクを 1 行にまとめるgroup_tasksに相当する引数がないため、同じタスク名が複数行ある場合の表示は意図と異なることがあります。タスクごとに行を分けたい場合は、yに渡す列を一意な値にするなどの工夫で対応します。
参考: plotly.py Issue #3675
“create_gantt() has the feature (argument) group_tasks that is not present with px.timeline”
(create_gantt() にある group_tasks 引数は px.timeline には存在しません。)
https://github.com/plotly/plotly.py/issues/3675
Python でガントチャートを作る手法の使い分け
ガントチャートを Python で作る手法は Plotly Express だけではありません。出力形式や用途によって適した手法が異なります。代表的な選択肢を整理します。
各手法の特徴
Plotly Express(px.timeline)は HTML を出力し、ズームやツールチップに対応します。チームでの共有や、計画と実績を対話的に確認する予実管理に向きます。
Matplotlib は、barhのleft引数で各バーを開始日の位置にずらす方法や、broken_barhで区間を分割して描く方法があります。静止画として細かくスタイルを制御でき、資料や印刷物に埋め込む図に適します。
python-gantt ライブラリ(Alexandre Norman 製)は、SVG を出力する Python クラスです。リソースや休暇、タスクの依存関係といった工程管理向けの概念を扱え、本格的なプロジェクト管理の図に向きます。
openpyxl は、Excel のセル上でガントチャート風の表現を作る選択肢です。成果物を Excel で完結させたい場合や、関係者が Excel 上で編集する運用に向きます。
| 手法 | 出力形式 | 対話操作 | 向いている用途 |
|---|---|---|---|
| Plotly Express(px.timeline) | HTML(ブラウザ) | ズーム・ツールチップ可 | 共有・予実管理・対話的な閲覧 |
| Matplotlib(barh / broken_barh) | 静止画(PNG / SVG) | なし | 資料・論文・印刷物への埋め込み |
| python-gantt ライブラリ | SVG | なし | リソース・休暇・依存関係を含む工程管理 |
| openpyxl | Excel セル | Excel 上で操作 | Excel で完結させたい運用 |
参考: python-gantt(PyPI)
“This is a python class to create gantt chart using SVG.”
(SVG でガントチャートを作成する Python クラスです。)
https://pypi.org/project/python-gantt/
どの手法を選ぶべきか
チームで共有しながら計画と実績を対話的に確認したい場合は、本記事で扱った Plotly Express が適しています。HTML として配布でき、ズームやツールチップで詳細を追えるためです。
資料や論文に静止画として埋め込みたい場合は Matplotlib、リソースや休暇を含む本格的な工程管理を行いたい場合は python-gantt ライブラリ、Excel 上で成果物を完結させたい場合は openpyxl が候補になります。なお Python での可視化全般については、関連記事『Python と AniList API でデータを取得してグラフ化する手順』でも Matplotlib によるグラフ化を扱っています。
まとめ
本記事では、Plotly Express のpx.timelineを使って、対話的なガントチャートを作成する方法を解説しました。Excel 連携によるデータ管理、計画と実績を重ねる予実管理、そして用途に応じた他手法との使い分けまで整理しました。
px.timelineを使えば数行で対話的なガントチャートを作成できる- データ管理は Excel に任せ、
pd.read_excelで読み込むと型変換も自動になる - 計画と実績を重ねると、遅延や前倒しを視覚的に把握できる
- 進捗率を
colorに渡すと、色の濃淡で進捗を表現できる create_ganttは非推奨で、現行はpx.timelineが標準- 静止画なら Matplotlib、工程管理なら python-gantt という使い分け
以上、最後までお読みいただきありがとうございました。
