Python でガントチャートを作成

Plotly というグラフィックスライブラリを使用して、ガントチャートを作成する方法を紹介します。

Plotly とは

Python、R、Julia、そして JavaScript などのプログラミング言語に対応したオープンソースのデータ可視化ライブラリです。データ解析やデータサイエンスの分野で広く使われており、インタラクティブなグラフやダッシュボードを簡単に作成することができます。

Plotly の主な特徴

  • インタラクティブ性
    • Plotly を使って作成されたグラフは、ユーザーがマウスオーバーやクリックなどの操作によって情報を取得できるようになっています。これにより、データの探索や理解が容易になります。
  • 多様なグラフタイプ
    • Plotly は、棒グラフ、折れ線グラフ、散布図、ヒストグラム、ヒートマップ、ボックスプロット、3D グラフなど、さまざまなグラフタイプに対応しています。
  • カスタマイズ性
    • グラフのスタイルや色、軸ラベル、凡例などの要素をカスタマイズすることができ、見やすく美しいグラフを作成することが可能です。
  • エクスポート機能
    • 作成したグラフを画像形式(PNG, JPEG, SVG など)や HTML 形式でエクスポートすることができ、ウェブサイトやブログに埋め込むことも可能です。

Plotly 活用例

実行例

次の Python スクリプトは、Plotly を使用して、CSV ファイルからタスクデータを読み込み、Plotly を使ってガントチャートを生成するものです。

# ----------------------------------------------------------------------------
# Author: tomo
# Creation Date: 2023-04-08
#
# This script is free to use and modify at your own discretion.
# No warranty is provided for the script's functionality.
# Use this script at your own risk.
# ----------------------------------------------------------------------------
import plotly.figure_factory as ff
import csv
import datetime

tasks = []

with open("tasks.csv", "r", encoding="utf-8") as csvfile:
    csvfile.readline()  # ヘッダー行をスキップ
    reader = csv.reader(csvfile)
    for row in reader:
        start_date = datetime.datetime.strptime(row[1], '%Y/%m/%d')
        finish_date = datetime.datetime.strptime(row[2], '%Y/%m/%d')
        task = dict(Task=row[0] + " ({}%)".format(row[3]),
                    Start=start_date,
                    Finish=finish_date,
                    Complete=int(row[3]))
        tasks.append(task)

fig = ff.create_gantt(tasks, index_col='Complete', show_colorbar=True, showgrid_x=True, showgrid_y=True, group_tasks=True)

# タスクの文字サイズを変更
fig.update_yaxes(tickfont=dict(size=14))

# 日付の文字サイズを変更し、日本語表記に設定
fig.update_xaxes(tickfont=dict(size=14), tickformat="%Y年%-m月%-d日")

fig.show()

CSV ファイル(サンプル)は以下のとおりです。

Task,Start,Finish,Complete
1.アイディアの構築,2023/4/10,2023/4/15,0
2.プランニング,2023/4/16,2023/4/20,0
3.デザイン,2023/4/15,2023/4/30,0
4.開発,2023/4/10,2023/4/15,0
5.テスト,2023/4/16,2023/4/20,0
6.マーケティング,2023/4/15,2023/4/30,0

出力結果は次のとおりです。

解説

このスクリプトは、CSV ファイルからタスクデータを読み込み、Plotly を使用してガントチャートを作成し、カスタマイズして表示するものです。タスク名、開始日、終了日、進捗率が含まれた CSV ファイルを元に、視覚的にわかりやすいガントチャートが作成されます。

CSVファイルを読み込む

タスクデータが格納された CSV ファイルを読み込み、それを tasks リストに格納します。

import csv
import datetime

tasks = []

with open("tasks.csv", "r", encoding="utf-8") as csvfile:
    csvfile.readline()  # ヘッダー行をスキップ
    reader = csv.reader(csvfile)
    for row in reader:
        start_date = datetime.datetime.strptime(row[1], '%Y/%m/%d')
        finish_date = datetime.datetime.strptime(row[2], '%Y/%m/%d')
        task = dict(Task=row[0] + " ({}%)".format(row[3]),
                    Start=start_date,
                    Finish=finish_date,
                    Complete=int(row[3]))
        tasks.append(task)
ガントチャートを作成

tasks リストを元にガントチャートを作成し、その結果を fig という変数に格納します。進捗率を示す index_col'Complete' を指定し、カラーバー、x 軸および y 軸のグリッドを表示し、タスクをグループ化して表示します。

import plotly.figure_factory as ff

fig = ff.create_gantt(tasks, index_col='Complete', show_colorbar=True, showgrid_x=True, showgrid_y=True, group_tasks=True)
タスク名と日付の文字サイズを変更

タスク名の文字サイズを 14 に設定し、日付の文字サイズを 14 に設定して日本語表記に変更します。

fig.update_yaxes(tickfont=dict(size=14))
fig.update_xaxes(tickfont=dict(size=14), tickformat="%Y年%-m月%-d日")
ガントチャートを表示

作成したガントチャートを表示します。

fig.show()

以上