【Python】Plotly Express でガントチャートを作成する方法とタスク管理の効率化

  • URLをコピーしました!
目次

はじめに

プロジェクト管理において、全体のスケジュール感や進捗を一目で把握できる「ガントチャート」は欠かせないツールです。 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 をおすすめします。その理由は以下のとおりです。

STEP
拡大・縮小(ズーム)が自由自在
Matplotlib

静止画(PNG 画像など)として出力されるため、長期のプロジェクトを表示すると文字が潰れたり、詳細が見えなくなったりします。

Plotly

Google マップのように、マウス操作で特定の期間をズームしたり、横にスクロールしたりできます。「全体の流れ」と「今週の細かい予定」を一つのグラフで両立できるのは大きな強みです。

STEP
マウスオーバーで詳細を表示(ツールチップ)
Matplotlib

全ての情報をグラフ上に文字として書く必要があり、情報量が増えるとごちゃごちゃしてしまいます。

Plotly

タスクの棒グラフにマウスを乗せた時だけ、「開始日・終了日・担当者・進捗率」などの詳細をポップアップ表示できます。見た目はスッキリさせたまま、必要な情報を埋め込めます。

STEP
Web との親和性

作成したグラフは HTML ファイルとして保存できるため、Chrome などのブラウザさえあれば、Python 環境がない人のパソコンでも動かすことができます。チームへの共有も非常にスムーズです。

環境準備とライブラリ

Python で効率的にガントチャートを作成するために、以下の3つのライブラリをインストールします。 pandasopenpyxl を組み合わせるのがポイントです。

plotly

インタラクティブなグラフを描画する主役のライブラリ

pandas

データ分析の定番。Excel や CSV データを、一瞬で整形してくれます。

openpyxl

Pandas が Excel ファイル(.xlsx)を読み込むために裏で動くライブラリ。Excel 連携で必須

インストールコマンド

ターミナル(Mac)またはコマンドプロンプト(Windows)を開き、以下のコマンドを実行してください。

pip install plotly pandas openpyxl

Jupyter Notebook や Google Colab を使用している場合も、コードセルの先頭に !pip install ... と入力して実行すればインストール可能です。

【実践】Plotly Express でガントチャートを作成

それでは、実際にコードを書いてみましょう。

STEP
最もシンプルなコード

現代の 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()
STEP
実行結果

たったこれだけのコードで、マウスを乗せると日付が表示され、ズーム操作も可能なガントチャートが表示されます。

【解決】タスクデータ作成の「面倒」をなくす工夫

ここからが本記事のメインテーマです。 ガントチャートをコードで作る際、最大のハードルになるのが「タスクデータの準備」ではないでしょうか?

課題: テキストエディタで 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/12026/4/12026/4/12026/4/1100
3要件定義計画2026/4/22026/4/52026/4/22026/4/6100
4基本設計計画2026/4/62026/4/122026/4/72026/4/13100
5詳細設計計画2026/4/132026/4/202026/4/142026/4/2290
6環境構築実行2026/4/212026/4/232026/4/232026/4/2580
7DB実装実行2026/4/242026/4/302026/4/262026/5/260
8API実装実行2026/5/12026/5/152026/5/340
9フロント実装実行2026/5/102026/5/252026/5/1220
10単体テストテスト2026/5/262026/5/310
11結合テストテスト2026/6/12026/6/100
12受入テストテスト2026/6/112026/6/150
13リリースリリース2026/6/162026/6/160

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))

カスタマイズのポイント

予実の可視化(斜線 vs 塗潰し)
  • 斜線(グレー): 当初の「計画」を表します。
  • 塗潰し(青): 実際の「実績」を表します。
  • この2つを重ねることで、「計画よりバーが伸びている(遅延)」や「計画より早く終わった(前倒し)」が一目で分かります。
青の濃淡で進捗を表現
  • 濃い紺色(100%): 完了したタスク
  • 薄い水色(0〜20%): 開始直後、または停滞しているタスク

▼ 実行結果(カスタマイズ版)

まとめ

本記事では、Python のライブラリ Plotly Express を使って、ガントチャートを作成する方法を紹介しました。

Plotly Express × Pandas なら高度な表現も可能

わずか数十行のコードで、「予実管理」や「進捗グラデーション」といった複雑な要件も実現できます。

「データ入力」は Excel に任せる

Python でリストを手書きするのではなく、使い慣れた Excel でデータを管理し、Python で読み込む(pd.read_excel)のが効率化のコツです。

以上、最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

インフラ(クラウド/NW/仮想化)から Web 開発まで、技術領域を横断して活動するエンジニア💻 コンシューマー向けエンタメ事業での新規開発・運営経験を活かし、実戦的な技術ノウハウを発信中

[ Certs ] CCIE Lifetime Emeritus / VCAP-DCA ✒️ [ Life ] 技術書・ビジネス書愛好家📖 / 小・中学校で卓球コーチ👟

目次