本記事ではPythonのグラフライブラリとして使えるplotlyによる「ガントチャート」の作成について紹介します。
plotlyチュートリアルのガントチャートから例題を抜粋しながら解説していきます。
プログラミングをこれから初める方向けに簡単なグラフを5種選びました。
①単純なガントチャート
②グループで色分けしたガントチャート
③数値で色分けしたガントチャート
④facet_rowを使ったガントチャート
⑤アニメーションを使ったガントチャート
今回紹介する例題ではグラフの元データを容易する必要がなく、下記プログラムを完コピすればグラフを作成することができます。
まずは実際に手を動かしてコードを書いて見てください。
Anacondaのインストールがまだの方はこちらの記事を参考に準備してください。
Jupyter notebookの起動と使い方まで紹介しています。
導入から基本的な使い方まで紹介しています。
今回も前回同様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=”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の詳しい使い方の解説はこちらで
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")
↓実務への応用はこちらの記事を参考にしてください
↓Plotlyについて学べる数少ない参考書です。