Python

【plotlyチュートリアル】<>ガントチャート

ガントチャート(Gantt charts)

本記事ではPythonのグラフライブラリとして使えるplotlyによる「ガントチャート」の作成について紹介します。

plotlyチュートリアルのガントチャートから例題を抜粋しながら解説していきます。

プログラミングをこれから初める方向けに簡単なグラフを5種選びました。

①単純なガントチャート

②グループで色分けしたガントチャート

③数値で色分けしたガントチャート

④facet_rowを使ったガントチャート

⑤アニメーションを使ったガントチャート

今回紹介する例題ではグラフの元データを容易する必要がなく、下記プログラムを完コピすればグラフを作成することができます。

まずは実際に手を動かしてコードを書いて見てください。

AnacondaのインストールとJupyter notebookの準備

Anacondaのインストールがまだの方はこちらの記事を参考に準備してください。

Jupyter notebookの起動と使い方まで紹介しています。

【2020年版、Python3をはじめよう!(Mac&Win対応)】AnacondaとJupyter notebookの始め方 はじめに Jupyter notebookとは Jupyter notebook(ジュピター・ノートブック)はブラウザ上で...

plotlyとplotly_expressのインストール

導入から基本的な使い方まで紹介しています。

Pythonをグラフ作成で学ぶ【plotly_expressで1行プログラミング】 【本記事の目標】 たった1行で動くグラフを作成し、体感する! これからPythonを学びたい人向けに朗報です。 今から紹介...

①単純なガントチャート

今回も前回同様plotly_expressを使用するので、まずはインポートします。

import plotly.express as px
import plotly.io as pio
import pandas as pd

データフレームを用意します。

仕事内容A,B,Cと開始日、終了日のデータを辞書型(dict)として保存したデータです。

df = pd.DataFrame([
    dict(Task="Job A", Start='2009-01-01', Finish='2009-02-28'),
    dict(Task="Job B", Start='2009-03-05', Finish='2009-04-15'),
    dict(Task="Job C", Start='2009-02-20', Finish='2009-05-30')
])

1行目がグラフを作成するコードです。

fig=px.timeline()がplotly_express(px)でガントチャート(gantt charts)を使いますよという意味です。

figはただの変数なので何でも大丈夫です。figure=図を意味しているので良く使われる表現です。

x_start=’Start’でx軸の開始がStartの日付となり、x_end=’Finish’で終了がFinishの日付になります。

y=’Task’でy軸はタスク名となります。

2行目はレイアウトを変更する際に使用するコードです。

y軸の値の大きい順に変更してくれます。

3行目は保存するコードです。(保存場所はJupyterの階層と同じ場所になります)

これはなくても大丈夫です。

htmlで保存すると、開いてグラフを動かすことが可能です。

また、マウスをグラフに当てた時に右上に表示されるカメラマークを押すとpngで保存できます。

また、ガントチャートにカーソルを合わせるとタスク名、開始日、終了日のデータが表示されます。

fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task")
fig.update_yaxes(autorange="reversed") # otherwise tasks are listed from the bottom up
pio.write_html(fig,file="./6-1.html")

②グループで色分けしたガントチャート

color=”Resourse”を追加することでグループで色分けされたガントチャートが表示されます。

df = pd.DataFrame([
    dict(Task="Job A", Start='2009-01-01', Finish='2009-02-28', Resource="Alex"),
    dict(Task="Job B", Start='2009-03-05', Finish='2009-04-15', Resource="Alex"),
    dict(Task="Job C", Start='2009-02-20', Finish='2009-05-30', Resource="Max")
])

fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task", color="Resource")
fig.update_yaxes(autorange="reversed")
pio.write_html(fig,file="./6-2.html")

③数値で色分けしたガントチャート

color=”Completion_pct”と数値データをcolorの対象とすることでカラーマップでガントチャートが表示されます。

df = pd.DataFrame([
    dict(Task="Job A", Start='2009-01-01', Finish='2009-02-28', Completion_pct=50),
    dict(Task="Job B", Start='2009-03-05', Finish='2009-04-15', Completion_pct=25),
    dict(Task="Job C", Start='2009-02-20', Finish='2009-05-30', Completion_pct=75)
])

fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task", color="Completion_pct")
fig.update_yaxes(autorange="reversed")
pio.write_html(fig,file="./6-3.html")

④facet_rowを使ったガントチャート

facet_row=”Resourse”とすることで共通のx軸を保持しながら複数のグループ毎でガントチャートを表示することができます。

df = pd.DataFrame([
    dict(Task="Job A", Start='2009-01-01', Finish='2009-02-28', Resource="Alex"),
    dict(Task="Job B", Start='2009-03-05', Finish='2009-04-15', Resource="Alex"),
    dict(Task="Job C", Start='2009-02-20', Finish='2009-05-30', Resource="Max")
])

fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task", facet_row="Resource")
fig.update_yaxes(autorange="reversed")
pio.write_html(fig,file="./6-4.html")

↓facet_rowの詳しい使い方の解説はこちらで

【plotlyレイアウト応用編】>Facet and Trellis Plots活用 はじめに 本記事の内容について plotlyレイアウト応用編ではグラフの見せ方について実例を紹介しながら学べる講座になりま...

⑤アニメーションを使ったガントチャート

animation_frame=”Resource”とすることでResourse毎にガントチャートがアニメーションで表示されます。

とある条件のガントチャートを絞って見たい時に便利です。

df = pd.DataFrame([
    dict(Task="Job A", Start='2009-01-01', Finish='2009-02-28', Resource="Alex", Completion_pct=50),
    dict(Task="Job B", Start='2009-03-05', Finish='2009-04-15', Resource="Alex", Completion_pct=25),
    dict(Task="Job C", Start='2009-02-20', Finish='2009-05-30', Resource="Max", Completion_pct=75),
    dict(Task="Job D", Start='2009-04-01', Finish='2009-04-28', Resource="Max", Completion_pct=50),
    dict(Task="Job E", Start='2009-05-05', Finish='2009-05-15', Resource="Alex", Completion_pct=25),
    dict(Task="Job F", Start='2009-06-20', Finish='2009-06-30', Resource="Max", Completion_pct=75)
])

fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task", color="Completion_pct", animation_frame="Resource")
fig.update_yaxes(autorange="reversed")
pio.write_html(fig,file="./6-5.html")

↓実務への応用はこちらの記事を参考にしてください

【Pythonで業務改善】設備の稼働状況見える化 製造業において設備の稼働時間・稼働率を見える化することは、改善すべき方向性を決める上でとても役に立ちます。 世の中には様々な見える化ソ...

Plotlyに関する書籍紹介

↓Plotlyについて学べる数少ない参考書です。

Mickey@コーヒー好きエンジニア

【製造業×プログラミング×AI】Python/VBAを活用した業務改善、Streamlit/Plotlyを活用したWebアプリ開発について初心者向けに発信中|趣味は自家焙煎コーヒー作り|noteでは焙煎理論を発信|ココナラではプログラミングに関する相談,就職/転職やコーヒーに関する相談などのサービスをやっています