Python

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

ガントチャート(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レイアウト応用編】<<第1回>>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")

ABOUT ME
Mickey@コーヒー好きエンジニア
【コーヒー×科学×AI×ものづくり】趣味は①家庭用ロースターで自家焙煎コーヒー作り②アプリ開発です。 Wordpressブログ、note、Instagramやっています♪ ブログでは自家焙煎の実例や実践的なプログラミングの例文紹介、noteではコーヒーの海外論文(主に焙煎理論)やAIに関する情報の発信をしています。