はじめに
プロジェクト管理において、全体のスケジュール感や進捗を一目で把握できる「ガントチャート」は欠かせないツールです。 Python の Plotly というライブラリを使えば、Excel のスクリーンショットのような静止画ではなく、マウスオーバーで詳細を表示したり、期間を拡大縮小できたりする「美しくインタラクティブなガントチャート」を作成できます。
しかし、いざ Python でチャートを作ろうとした時、こんな悩みを持ったことはありませんか?
「コードを書く前の、タスクデータをまとめた CSV ファイルを作るのが面倒くさい……」
日付をテキストで一つひとつ入力したり、フォーマットを整えたりするのは、意外と手間がかかる作業です。 そこで本記事では、従来の古い書き方(figure_factory)ではなく、現在の主流である 「Plotly Express」 と 「Pandas」 を組み合わせた作成方法を紹介します。
- Plotly Express を使った、短くシンプルなガントチャート作成コード
- Pandas を使って Excel / CSV から簡単にデータを読み込む方法
- 日本語表示や色分けなどのカスタマイズ設定
Plotlyとは?(選ばれる理由)
Plotly(プロットリー)は、Python、R、JavaScript などに対応したオープンソースのデータ可視化ライブラリです。 データサイエンスの分野で広く使われていますが、最大の特徴は 「作ったグラフが Web ブラウザ上でグリグリ動く(インタラクティブである)」 という点です。

なぜ Matplotlib ではなく Plotly なのか?
Python のグラフ描画といえば Matplotlib が有名ですが、ガントチャート作成において私は断然 Plotly をおすすめします。その理由は以下のとおりです。
- Matplotlib
-
静止画(PNG 画像など)として出力されるため、長期のプロジェクトを表示すると文字が潰れたり、詳細が見えなくなったりします。
- Plotly
-
Google マップのように、マウス操作で特定の期間をズームしたり、横にスクロールしたりできます。「全体の流れ」と「今週の細かい予定」を一つのグラフで両立できるのは大きな強みです。
- Matplotlib
-
全ての情報をグラフ上に文字として書く必要があり、情報量が増えるとごちゃごちゃしてしまいます。
- Plotly
-
タスクの棒グラフにマウスを乗せた時だけ、「開始日・終了日・担当者・進捗率」などの詳細をポップアップ表示できます。見た目はスッキリさせたまま、必要な情報を埋め込めます。
作成したグラフは HTML ファイルとして保存できるため、Chrome などのブラウザさえあれば、Python 環境がない人のパソコンでも動かすことができます。チームへの共有も非常にスムーズです。
環境準備とライブラリ
Python で効率的にガントチャートを作成するために、以下の3つのライブラリをインストールします。 pandas と openpyxl を組み合わせるのがポイントです。
- plotly
-
インタラクティブなグラフを描画する主役のライブラリ
- pandas
-
データ分析の定番。Excel や CSV データを、一瞬で整形してくれます。
- openpyxl
-
Pandas が Excel ファイル(.xlsx)を読み込むために裏で動くライブラリ。Excel 連携で必須
インストールコマンド
ターミナル(Mac)またはコマンドプロンプト(Windows)を開き、以下のコマンドを実行してください。
pip install plotly pandas openpyxl
Jupyter Notebook や Google Colab を使用している場合も、コードセルの先頭に !pip install ... と入力して実行すればインストール可能です。
【実践】Plotly Express でガントチャートを作成
それでは、実際にコードを書いてみましょう。
現代の Plotly(バージョン 4.9 以降)では、plotly.express というモジュールに含まれる px.timeline 関数を使います。 これを使うと、わずか数行でガントチャートが完成します。
import plotly.express as px
import pandas as pd
# 1. データ準備
df = pd.DataFrame([
dict(Task="要件定義", Start='2024-04-01', Finish='2024-04-05'),
dict(Task="設計", Start='2024-04-05', Finish='2024-04-15'),
dict(Task="実装", Start='2024-04-15', Finish='2024-04-30')
])
# 2. ガントチャート作成
fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task")
# 【重要】Y軸の並び順を反転させる(これを入れないと下から順になります)
fig.update_yaxes(autorange="reversed")
# 3. 表示
fig.show()たったこれだけのコードで、マウスを乗せると日付が表示され、ズーム操作も可能なガントチャートが表示されます。


【解決】タスクデータ作成の「面倒」をなくす工夫
ここからが本記事のメインテーマです。 ガントチャートをコードで作る際、最大のハードルになるのが「タスクデータの準備」ではないでしょうか?
課題: テキストエディタで CSV の日付を手入力するのは辛い
これまでの手法では、テキストエディタやメモ帳を開いて、以下のようなデータを手打ちする必要がありました。
要件定義, 2024-04-01, 2024-04-05, 50
日付のフォーマットを間違えたり、カンマを忘れたりしてエラーになる……。これでは本末転倒です。
解決策: 「Excel」で管理して、Python で直接読み込む
そこで提案するのが、「データ管理は Excel(または Google スプレッドシート)に任せる」 という方法です。
- 入力が早い
-
Excel なら、日付をドラッグ & ドロップ(オートフィル)で一気に入力できます。
- 型変換が自動
-
Pandas の
read_excel関数を使えば、Excel 上の日付データを自動的に「日付型」として認識してくれます。文字列のパース(変換処理)を書く必要はありません。 - 予実管理も簡単
-
「計画」と「実績」の列を作っておけば、複雑な比較チャートも簡単に生成できます。
▼ Excel での管理イメージ(tasks.xlsx の作成例)
以下の形式で Excel を作成し、tasks.xlsx として保存してください。 ※日付は必ず「短い日付形式(yyyy/m/d)」に設定してください。
【サンプルデータ】tasks.xlsx の中身(クリックで展開)
| 1 | タスク | フェーズ | 計画開始 | 計画完了 | 実績開始 | 実績完了 | 進捗率 |
| 2 | キックオフ | 計画 | 2026/4/1 | 2026/4/1 | 2026/4/1 | 2026/4/1 | 100 |
| 3 | 要件定義 | 計画 | 2026/4/2 | 2026/4/5 | 2026/4/2 | 2026/4/6 | 100 |
| 4 | 基本設計 | 計画 | 2026/4/6 | 2026/4/12 | 2026/4/7 | 2026/4/13 | 100 |
| 5 | 詳細設計 | 計画 | 2026/4/13 | 2026/4/20 | 2026/4/14 | 2026/4/22 | 90 |
| 6 | 環境構築 | 実行 | 2026/4/21 | 2026/4/23 | 2026/4/23 | 2026/4/25 | 80 |
| 7 | DB実装 | 実行 | 2026/4/24 | 2026/4/30 | 2026/4/26 | 2026/5/2 | 60 |
| 8 | API実装 | 実行 | 2026/5/1 | 2026/5/15 | 2026/5/3 | 40 | |
| 9 | フロント実装 | 実行 | 2026/5/10 | 2026/5/25 | 2026/5/12 | 20 | |
| 10 | 単体テスト | テスト | 2026/5/26 | 2026/5/31 | 0 | ||
| 11 | 結合テスト | テスト | 2026/6/1 | 2026/6/10 | 0 | ||
| 12 | 受入テスト | テスト | 2026/6/11 | 2026/6/15 | 0 | ||
| 13 | リリース | リリース | 2026/6/16 | 2026/6/16 | 0 |
Excel データを読み込んでチャート化するコード
まずは、この Excel を読み込んで「計画通りに進んだ場合のスケジュール」をと表示してみます。 難しい加工はせず、シンプルに読み込むだけのコードです。
import plotly.express as px
import pandas as pd
# 1. Excelファイルを読み込む
# 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 に追記して、Python スクリプトを実行」というサイクルで、スケジュール管理ができます。
実用的なカスタマイズ(予実管理・進捗色分け)
基本の表示ができたら、さらに見やすく情報を整理しましょう。 ここでは、プロジェクト管理で重要な「予実管理(計画と実績の比較)」と、「進捗率に応じた直感的な色分け」を行います。
完成形のコード
以下のコードでは、「計画」をグレーの斜線、「実績」を青色のグラデーションで表現し、それらを重ね合わせて表示します。
import plotly.express as px
import pandas as pd
import os
import webbrowser
# 1. データ読み込み
# ※Excelの日付列は「短い日付形式(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. チャート作成
# ① ベースとなる「実績(青グラデーション)」を作成
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
)
# ② 背景となる「計画(グレー斜線)」を作成
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%): 開始直後、または停滞しているタスク
▼ 実行結果(カスタマイズ版)


まとめ
本記事では、Python のライブラリ Plotly Express を使って、ガントチャートを作成する方法を紹介しました。
- Plotly Express × Pandas なら高度な表現も可能
-
わずか数十行のコードで、「予実管理」や「進捗グラデーション」といった複雑な要件も実現できます。
- 「データ入力」は Excel に任せる
-
Python でリストを手書きするのではなく、使い慣れた Excel でデータを管理し、Python で読み込む(
pd.read_excel)のが効率化のコツです。
以上、最後までお読みいただきありがとうございました。

