こんな人にオススメ
plotly
でガントチャートを作りたいんだけど、どうやってコードを書けばいい?
ということで、今回はplotly
のpx.timeline
を使用してガントチャートを作成する。ガントチャートはプロジェクトなどの管理に使われるツリー状のグラフ。
日付を横軸・人やプロジェクト名を縦軸にしていつまでに何をするか・誰がするかを表すのに適したグラフだ。ガントチャートを作成できるサービスは存在するが、plotlyで自作することも可能。
plotly
だとガントチャートはpx
を使用してグラフを作成する。ガントチャートに似た棒グラフについては以下。px
とgo
でそれぞれ記事にしている。
-
-
【plolty&棒グラフ】px.barでバーチャートを作成
続きを見る
-
-
【plotly&棒グラフ】go.Barでバーチャートを作成
続きを見る
Plotly
公式の「Gantt Charts in Python」にガントチャートの作成方法は書かれている。しかし、バージョン4.9以前に使われていたfigure factoryの解説もあり、px.timeline
の解説は少なめ。
本記事では公式で書かれている内容よりも細かく解説しているので、 plotly
のpx.timeline
を使ったガントチャートの作成方法を理解していただけると幸いだ。
python環境は以下。
- Python 3.10.1
- pandas 1.3.5
- plotly 5.4.0
- plotly-orca 3.4.2
作成したコード全文
下準備(import
)
import pandas as pd import plotly.express as px import plotly.io as pio
まずは下準備としてのimport
関連。px.timeline
の場合、データから自動的に日付を判断してくれるのでdatetime
のimport
は必要ないが、日付の編集などを行いたいときはimport datetime
などでdatetime
をimport
すると良いだろう。
また、px
は基本的にpandas
のデータフレームをベースにグラフを描くことになるのでpandas
もimport
している。
あとはpx
本体とグラフ保存用のpio
。グラフ保存に関しては以下。
-
-
【plotly&orca】plotlyで静止画保存(orca)
続きを見る
シンプルにガントチャートを作成
まずはシンプルにガントチャートを作成。引数として使うのは以下。
data_frame
: グラフ化したいデータの入ったデータフレーム(引数省略)x_start
: ガントチャートの開始日時x_end
: ガントチャートの終了日時y
: 縦軸の値
px.timeline
は横軸を自動で時刻として認識してくれるので、以下に示すコードのようにデータフレームを作成しておけば勝手に横軸を整理してくれる。
もし上手く時刻に変換してくれなかったら、本記事の最後の方で解説する時刻の書式変更」の方法を参照いただきたい。
縦軸はTask
列を指定し、各Job
毎にグラフ化。あとはフォントサイズを上げてグラフを表示・保存した。簡単にグラフが描けるのがpx
の魅力。
import pandas as pd import plotly.express as px import plotly.io as pio # pxでガントチャートを作成 # そのまま作成すると縦軸が上下逆さまに # ガントチャートを作成するデータフレーム df = pd.DataFrame([ dict( Task='Job A', # ジョブの名称 Start='2022-01-01', # 開始日 Finish='2022-02-28', # 終了日 ), dict( Task='Job B', Start='2022-03-05', # 開始日 Finish='2022-04-15', # 終了日 ), dict( Task='Job C', Start='2022-02-20', # 開始日 Finish='2022-05-30', # 終了日 ) ]) print(df) # Task Start Finish # 0 Job A 2022-01-01 2022-02-28 # 1 Job B 2022-03-05 2022-04-15 # 2 Job C 2022-02-20 2022-05-30 fig = px.timeline( df, # 使用するデータフレーム x_start='Start', x_end='Finish', # 横軸の開始・終了の列名 y='Task', # 縦軸の列名 ) # グラフ全体とホバーのフォントサイズ変更 fig.update_layout(font_size=20, hoverlabel_font_size=20) fig.show() # グラフ保存 prefix = 'plotly-gantt-charts' # 保存ファイル名の接頭辞 save_name = f"{prefix}_simple" pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca' pio.write_html(fig, f"{save_name}.html") pio.write_image(fig, f"{save_name}.png")
autorange='reversed'
で縦軸の順番を自然に
さっきのグラフでも良かったんだけど、縦軸が上からJob C, B, Aと逆転している。データフレームではA, B, Cの順番だったからこれは気持ち悪い。
そんな時はfig.update_yaxes
でfig.update_yaxes(autorange='reversed')
として縦軸の向きを逆転させたらいい。fig.update_yaxes
などのfig.update
シリーズについては以下の記事で詳しく解説している。
-
-
【plotly&fig作成と更新】add_traceやupdate_layoutの使い方
続きを見る
import pandas as pd import plotly.express as px import plotly.io as pio # ガントチャートを作成するデータフレーム df = pd.DataFrame([ dict( Task='Job A', # ジョブの名称 Start='2022-01-01', # 開始日 Finish='2022-02-28', # 終了日 ), dict( Task='Job B', Start='2022-03-05', # 開始日 Finish='2022-04-15', # 終了日 ), dict( Task='Job C', Start='2022-02-20', # 開始日 Finish='2022-05-30', # 終了日 ) ]) print(df) # Task Start Finish # 0 Job A 2022-01-01 2022-02-28 # 1 Job B 2022-03-05 2022-04-15 # 2 Job C 2022-02-20 2022-05-30 fig = px.timeline( df, # 使用するデータフレーム x_start='Start', x_end='Finish', # 横軸の開始・終了の列名 y='Task', # 縦軸の列名 ) # グラフ全体とホバーのフォントサイズ変更 fig.update_layout(font_size=20, hoverlabel_font_size=20) # 縦軸の向きを逆にする fig.update_yaxes(autorange='reversed') fig.show() # グラフ保存 prefix = 'plotly-gantt-charts' # 保存ファイル名の接頭辞 save_name = f"{prefix}_autorange_reversed" pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca' pio.write_html(fig, f"{save_name}.html") pio.write_image(fig, f"{save_name}.png")
autorange=False
にするとグラフ上部に空間が
なお、autorange
はデフォルトはTrue
なんだけど、autorange=False
にするとグラフ上部に空間ができる。このままだと見栄えが悪いのでautorange=False
にしない方が良いだろう。
import pandas as pd import plotly.express as px import plotly.io as pio # autorange=Falseにする # ガントチャートを作成するデータフレーム df = pd.DataFrame([ dict( Task='Job A', # ジョブの名称 Start='2022-01-01', # 開始日 Finish='2022-02-28', # 終了日 ), dict( Task='Job B', Start='2022-03-05', # 開始日 Finish='2022-04-15', # 終了日 ), dict( Task='Job C', Start='2022-02-20', # 開始日 Finish='2022-05-30', # 終了日 ) ]) print(df) # Task Start Finish # 0 Job A 2022-01-01 2022-02-28 # 1 Job B 2022-03-05 2022-04-15 # 2 Job C 2022-02-20 2022-05-30 fig = px.timeline( df, # 使用するデータフレーム x_start='Start', x_end='Finish', # 横軸の開始・終了の列名 y='Task', # 縦軸の列名 ) # グラフ全体とホバーのフォントサイズ変更 fig.update_layout(font_size=20, hoverlabel_font_size=20) # 自動範囲調節をオフにする fig.update_yaxes(autorange=False) fig.show() # グラフ保存 prefix = 'plotly-gantt-charts' # 保存ファイル名の接頭辞 save_name = f"{prefix}_autorange_False" pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca' pio.write_html(fig, f"{save_name}.html") pio.write_image(fig, f"{save_name}.png")
color
で色分けする
ここまでは全て同じ色でガントチャートを作成した。ただ、1色だけだと見づらいのでここでは色分けの方法を解説する。
Resource
(人名、リソース)で色分け
まずはリソースで色分けする。ここでのリソースは人名で、Alex
が2種類のTask
(Job
)に参加していることが一目でわかる。
指定方法は簡単で、データフレームにリソースを示す列を追加してpx.timeline
の引数color
にデータフレームの列名(Resource
)を指定するだけ。
import pandas as pd import plotly.express as px import plotly.io as pio # colorで色分けする(人名、リソース) # ガントチャートを作成するデータフレーム df = pd.DataFrame([ dict( Task='Job A', # ジョブの名称 Start='2022-01-01', Finish='2022-02-28', # 開始年と終了年 Resource='Alex', # リソース名 ), dict( Task='Job B', Start='2022-03-05', Finish='2022-04-15', Resource='Alex', # リソース名 ), dict( Task='Job C', Start='2022-02-20', Finish='2022-05-30', Resource='Max', # リソース名 ) ]) print(df) # Task Start Finish Resource # 0 Job A 2022-01-01 2022-02-28 Alex # 1 Job B 2022-03-05 2022-04-15 Alex # 2 Job C 2022-02-20 2022-05-30 Max fig = px.timeline( df, # 使用するデータフレーム x_start='Start', x_end='Finish', # 横軸の開始・終了の列名 y='Task', # 縦軸の列名 color='Resource', # 色分けをリソースにする ) # グラフ全体とホバーのフォントサイズ変更 fig.update_layout(font_size=20, hoverlabel_font_size=20) # 縦軸の向きを逆にする fig.update_yaxes(autorange='reversed') fig.show() # グラフ保存 prefix = 'plotly-gantt-charts' # 保存ファイル名の接頭辞 save_name = f"{prefix}_color_Resource" pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca' pio.write_html(fig, f"{save_name}.html") pio.write_image(fig, f"{save_name}.png")
color_discrete_sequence
で色の変更
plotly
のデフォルトだと最初のプロットは青紫っぽい色、次の色は朱色っぽい赤色。この色を自由に変更するにはpx.timeline
の引数color_discrete_sequence
を使う。
この引数で好みの色を配列で指定すると、その順番でチャートの色を変更してくれる。上のグラフではviolet
とorange
を指定。なお、今回は2色使用なので3色目のgreen
は反映されない。
また、color_discrete_sequence=’red’
すると以下のように1色目がred
のr
を取ってしまうのでエラー。また、color_discrete_sequence=[’red’]
のように1色だけの配列にすると色分けされなくなる。
ValueError: Invalid value of type 'builtins.str' received for the 'color' property of bar.marker Received value: 'r'
import pandas as pd import plotly.express as px import plotly.io as pio # color_discrete_sequenceで色を変更 # ガントチャートを作成するデータフレーム df = pd.DataFrame([ dict( Task='Job A', # ジョブの名称 Start='2022-01-01', Finish='2022-02-28', # 開始年と終了年 Resource='Alex', # リソース名 ), dict( Task='Job B', Start='2022-03-05', Finish='2022-04-15', Resource='Alex', # リソース名 ), dict( Task='Job C', Start='2022-02-20', Finish='2022-05-30', Resource='Max', # リソース名 ) ]) print(df) # Task Start Finish Resource # 0 Job A 2022-01-01 2022-02-28 Alex # 1 Job B 2022-03-05 2022-04-15 Alex # 2 Job C 2022-02-20 2022-05-30 Max fig = px.timeline( df, # 使用するデータフレーム x_start='Start', x_end='Finish', # 横軸の開始・終了の列名 y='Task', # 縦軸の列名 color='Resource', # 色分けをリソースにする # 色の変更。余った色は反映されない color_discrete_sequence=('violet', 'orange', 'green') ) # グラフ全体とホバーのフォントサイズ変更 fig.update_layout(font_size=20, hoverlabel_font_size=20) # 縦軸の向きを逆にする fig.update_yaxes(autorange='reversed') fig.show() # # グラフ保存 prefix = 'plotly-gantt-charts' # 保存ファイル名の接頭辞 save_name = f"{prefix}_color_discrete_sequence" pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca' pio.write_html(fig, f"{save_name}.html") pio.write_image(fig, f"{save_name}.png")
Completion_pct
(完了度合い、数値)で色分け
リソース名だけじゃなくて完了度合いで色分けしたい時もあるだろう。その場合も同じようにpx.timeline
の引数color
を使うだけ。
ただし、完了度合いの場合は数値になるので、自動でカラーバーとカラーバータイトルをつけてくれる。
import pandas as pd import plotly.express as px import plotly.io as pio # colorで色分けする(完了度合い) # ガントチャートを作成するデータフレーム df = pd.DataFrame([ dict( Task='Job A', # ジョブの名称 Start='2022-01-01', Finish='2022-02-28', # 開始年と終了年 Completion_pct=50, # 完了% ), dict( Task='Job B', Start='2022-03-05', Finish='2022-04-15', Completion_pct=25, # 完了% ), dict( Task='Job C', Start='2022-02-20', Finish='2022-05-30', Completion_pct=75, # 完了% ) ]) print(df) # Task Start Finish Completion_pct # 0 Job A 2022-01-01 2022-02-28 50 # 1 Job B 2022-03-05 2022-04-15 25 # 2 Job C 2022-02-20 2022-05-30 75 fig = px.timeline( df, # 使用するデータフレーム x_start='Start', x_end='Finish', # 横軸の開始・終了の列名 y='Task', # 縦軸の列名 color='Completion_pct', # 色分けを完了度合いにする ) # グラフ全体とホバーのフォントサイズ変更 fig.update_layout(font_size=20, hoverlabel_font_size=20) # 縦軸の向きを逆にする fig.update_yaxes(autorange='reversed') fig.show() # グラフ保存 prefix = 'plotly-gantt-charts' # 保存ファイル名の接頭辞 save_name = f"{prefix}_color_Completion_pct" pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca' pio.write_html(fig, f"{save_name}.html") pio.write_image(fig, f"{save_name}.png")
color_continuous_scale
でカラースケールを変更
カラーバーの色合いを変更することももちろん可能。上のグラフではカラースケールのJet
という色を使用してカラーバーの色を変更した。
カラースケールに関してはPlotly
公式の「Built-in Continuous Color Scales in Python」で詳しく解説されている。
import pandas as pd import plotly.express as px import plotly.io as pio # color_continuous_scaleでカラースケールの変更 # ガントチャートを作成するデータフレーム df = pd.DataFrame([ dict( Task='Job A', # ジョブの名称 Start='2022-01-01', Finish='2022-02-28', # 開始年と終了年 Completion_pct=50, # 完了% ), dict( Task='Job B', Start='2022-03-05', Finish='2022-04-15', Completion_pct=25, # 完了% ), dict( Task='Job C', Start='2022-02-20', Finish='2022-05-30', Completion_pct=75, # 完了% ) ]) fig = px.timeline( df, # 使用するデータフレーム x_start='Start', x_end='Finish', # 横軸の開始・終了の列名 y='Task', # 縦軸の列名 color='Completion_pct', # 色分けを完了度合いにする color_continuous_scale='Jet' # 色の付け方をJetに変更 ) # グラフ全体とホバーのフォントサイズ変更 fig.update_layout(font_size=20, hoverlabel_font_size=20) # 縦軸の向きを逆にする fig.update_yaxes(autorange='reversed') fig.show() # グラフ保存 prefix = 'plotly-gantt-charts' # 保存ファイル名の接頭辞 save_name = f"{prefix}_color_Completion_pct_Jet" pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca' pio.write_html(fig, f"{save_name}.html") pio.write_image(fig, f"{save_name}.png")
同じ人は同じ行に配置
同じ人を同じ行に配置することも可能。上のグラフではAlex
が2種類のJob
を請け負っているので、同じ行に配置されるように縦軸をResource
にした。
また、px.timeline
の引数color
にもResource
を使用することで色分けもしてくれるから、さらに見やすくなる。
import pandas as pd import plotly.express as px import plotly.io as pio # colorで色分け(人名、同じ人は同じ行に) # ガントチャートを作成するデータフレーム df = pd.DataFrame([ dict( Task='Job A', # ジョブの名称 Start='2022-01-01', Finish='2022-02-28', # 開始年と終了年 Resource='Alex', # リソース名 ), dict( Task='Job B', Start='2022-03-05', Finish='2022-04-15', Resource='Alex', # リソース名 ), dict( Task='Job C', Start='2022-02-20', Finish='2022-05-30', Resource='Max', # リソース名 ) ) fig = px.timeline( df, # 使用するデータフレーム x_start='Start', x_end='Finish', # 横軸の開始・終了の列名 y='Resource', # 縦軸の列名をリソースに変更 color='Resource', # 色分けをリソースにする ) # グラフ全体とホバーのフォントサイズ変更 fig.update_layout(font_size=20, hoverlabel_font_size=20) fig.show() # グラフ保存 prefix = 'plotly-gantt-charts' # 保存ファイル名の接頭辞 save_name = f"{prefix}_y_Resource" pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca' pio.write_html(fig, f"{save_name}.html") pio.write_image(fig, f"{save_name}.png")
autorange='reversed'
だと凡例と縦軸の向きが逆に
注意点としてはautorange='reversed'
にすると凡例と縦軸の向きが逆になってしまうこと。シンプルにガントチャートを作成するときにはreversed
にする方が良かったが、ここではその逆。ややこしい。
import pandas as pd import plotly.express as px import plotly.io as pio # autorange='reversed'にすると凡例と縦軸の向きが逆に # ガントチャートを作成するデータフレーム df = pd.DataFrame([ dict( Task='Job A', # ジョブの名称 Start='2022-01-01', Finish='2022-02-28', # 開始年と終了年 Resource='Alex', # リソース名 ), dict( Task='Job B', Start='2022-03-05', Finish='2022-04-15', Resource='Alex', # リソース名 ), dict( Task='Job C', Start='2022-02-20', Finish='2022-05-30', Resource='Max', # リソース名 ) ]) fig = px.timeline( df, # 使用するデータフレーム x_start='Start', x_end='Finish', # 横軸の開始・終了の列名 y='Resource', # 縦軸の列名をリソースに変更 color='Resource', # 色分けをリソースにする ) # グラフ全体とホバーのフォントサイズ変更 fig.update_layout(font_size=20, hoverlabel_font_size=20) # 縦軸の向きを逆にすると凡例と縦軸が逆になる fig.update_yaxes(autorange='reversed') fig.show() # グラフ保存 prefix = 'plotly-gantt-charts' # 保存ファイル名の接頭辞 save_name = f"{prefix}_y_Resource_recersed" pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca' pio.write_html(fig, f"{save_name}.html") pio.write_image(fig, f"{save_name}.png")
横軸の時間書式を変更
これまでは英語表記の時間軸でグラフを作成した。Mar 2022
といった具合だ。ただ、この書き方だと慣れていないとぱっと見で理解しにくい。
上のグラフのように時刻を日本語に変更するには、fig.update_xaxes
の引数tickformat
で年(%Y
)、月(%m
)、日(%d
)の間に年月日を入れたらいい。
fig.update_xaxes
はfig.update_layout(xaxis=dict(tickformat...))
という書き方でも可能。
import pandas as pd import plotly.express as px import plotly.io as pio # 横軸の時間書式を変更 # ガントチャートを作成するデータフレーム df = pd.DataFrame([ dict( Task='Job A', # ジョブの名称 Start='2022-01-01', Finish='2022-02-28', # 開始年と終了年 Resource='Alex', # リソース名 ), dict( Task='Job B', Start='2022-03-05', Finish='2022-04-15', Resource='Alex', # リソース名 ), dict( Task='Job C', Start='2022-02-20', Finish='2022-05-30', Resource='Max', # リソース名 ) ]) fig = px.timeline( df, # 使用するデータフレーム x_start='Start', x_end='Finish', # 横軸の開始・終了の列名 y='Task', # 縦軸の列名 ) # グラフ全体とホバーのフォントサイズ変更 fig.update_layout(font_size=20, hoverlabel_font_size=20) # 横軸の書式を変更 fig.update_xaxes(tickformat='%Y年%m月%d日') # 縦軸の向きを逆にする fig.update_yaxes(autorange='reversed') fig.show() # グラフ保存 prefix = 'plotly-gantt-charts' # 保存ファイル名の接頭辞 save_name = f"{prefix}_tickformat" pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca' pio.write_html(fig, f"{save_name}.html") pio.write_image(fig, f"{save_name}.png")
rangeselector
とrangeslider
を追加
レイアウトにrangeselector
を追加することで、簡単に表示範囲を変更することができる。さらにrangeslider
を使うことで全体の中でどの部分を拡大しているのかもわかりやすい。rangeselector
, rangeslider
については以下の記事を参照。
-
-
【plotly&rangeslider/rangeselector】レンジスライダーとレンジセレクターで時系列を見やすく
続きを見る
ここではrangeselector
で14日=2週間、1ヶ月、2ヶ月、全体表示のボタンを追加した。rangeselector
にはweekがないので、週単位にしたいときは日換算しないといけない。
import pandas as pd import plotly.express as px import plotly.io as pio # ガントチャートを作成するデータフレーム df = pd.DataFrame([ dict( Task='Job A', # ジョブの名称 Start='2022-01-01', Finish='2022-02-28', # 開始年と終了年 Resource='Alex', # リソース名 ), dict( Task='Job B', Start='2022-03-05', Finish='2022-04-15', Resource='Alex', # リソース名 ), dict( Task='Job C', Start='2022-02-20', Finish='2022-05-30', Resource='Max', # リソース名 ) ]) fig = px.timeline( df, # 使用するデータフレーム x_start='Start', x_end='Finish', # 横軸の開始・終了の列名 y='Task', # 縦軸の列名 ) # グラフ全体とホバーのフォントサイズ変更 fig.update_layout(font_size=20, hoverlabel_font_size=20) # 横軸のレイアウト修正 fig.update_xaxes( # 横軸の書式を変更 tickformat='%Y年%m月%d日', # グラフ上にレンジセレクターを追加 rangeselector=dict( buttons=list([ # 14日間=2週間 dict( count=14, # 数値 label='2w', # ボタンラベル step='day', # 単位 stepmode='backward' # 現時点より以前 ), # 1ヶ月 dict( count=1, label='1m', step='month', stepmode='backward' ), # 2ヶ月 dict( count=2, label='2m', step='month', stepmode='backward' ), dict(step='all') ]) ), # グラフ下にレンジスライダーを追加 rangeslider=dict(visible=True), ) # 縦軸の向きを逆にする fig.update_yaxes(autorange='reversed') fig.show() # グラフ保存 prefix = 'plotly-gantt-charts' # 保存ファイル名の接頭辞 save_name = f"{prefix}_rangeselector_rangeslider" pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca' pio.write_html(fig, f"{save_name}.html") pio.write_image(fig, f"{save_name}.png")
facet_col
でサブプロット風に
最後にpx
特有のサブプロットのようなグラフの描き方facet
を使用する。facet
については以下の記事を参照。
-
-
【px&facet】plotly.expressでsubplotsを描く
続きを見る
facet_col
で列の分割を、facet_row
で行の分割をデータフレームの列名で指定可能。ただし、分割数は列方向でしか指定できないからfacet_col
を使用する方がわかりやすい。
また、以下の引数も追加してより見やすいようにガントチャートを作成。fig.update_traces
でtextposition
, insidetextanchor
を設定することでpx.timeline
の引数text
を置く位置を決めた。
- opacity: 不透明度
- title: グラフタイトル
- hover_data: マウスオーバー時に出る情報
- text: バー上に表記する内容
今回は以下のcsvデータを予め作成し、これを読み込んでグラフ化する。idea
列はこのリソースや期間はどうですかっていうアイデアの意味で作成。
このidea
ごとにfacet
でサブプロットのガントチャートを作成した。
Task | Start | Finish | Resource | Completion_pct | idea |
---|---|---|---|---|---|
JobA | 2022/1/1 | 2022/2/28 | Alex | 50 | 1 |
JobB | 2022/3/5 | 2022/4/15 | Alex | 25 | 1 |
JobC | 2022/2/20 | 2022/5/30 | Max | 75 | 1 |
JobA | 2022/1/26 | 2022/3/25 | Bob | 50 | 2 |
JobB | 2022/4/11 | 2022/5/10 | Daniel | 25 | 2 |
JobC | 2022/3/17 | 2022/6/24 | Mike | 75 | 2 |
JobA | 2022/1/31 | 2022/3/30 | Nick | 50 | 3 |
JobB | 2022/4/4 | 2022/5/15 | Ben | 25 | 3 |
JobC | 2022/3/22 | 2022/6/29 | Max | 75 | 3 |
JobA | 2022/1/12 | 2022/4/4 | Alex | 50 | 4 |
JobB | 2022/4/9 | 2022/5/20 | Ben | 25 | 4 |
JobC | 2022/3/27 | 2022/7/14 | Nick | 75 | 4 |
import pandas as pd import plotly.express as px import plotly.io as pio # データの読み込み # parse_datesで時間に変換する列を選択 df = pd.read_csv('facet.csv', parse_dates=[1, 2]) print(df) # Task Start Finish Resource Completion_pct idea # 0 JobA 2022-01-01 2022-02-28 Alex 50 1 # 1 JobB 2022-03-05 2022-04-15 Alex 25 1 # 2 JobC 2022-02-20 2022-05-30 Max 75 1 # 3 JobA 2022-01-26 2022-03-25 Bob 50 2 # 4 JobB 2022-03-30 2022-05-10 Daniel 25 2 # 5 JobC 2022-03-17 2022-06-24 Mike 75 2 # 6 JobA 2022-01-31 2022-03-30 Nick 50 3 # 7 JobB 2022-04-04 2022-05-15 Ben 25 3 # 8 JobC 2022-03-22 2022-06-29 Max 75 3 # 9 JobA 2022-02-05 2022-04-04 Alex 50 4 # 10 JobB 2022-04-09 2022-05-20 Ben 25 4 # 11 JobC 2022-03-27 2022-07-04 Nick 75 4 fig = px.timeline( df, # 使用するデータフレーム x_start='Start', x_end='Finish', # 横軸の開始・終了の列名 y='Task', # 縦軸の列名 color='Resource', opacity=0.5, # 不透明度を下げる title='Gantt Charts', # グラフタイトル hover_data=df, # ホバーで表示する情報はデータフレームの全情報 text='Resource', # バー上に文字を追加 facet_col='idea', # どの列で分割するか facet_col_wrap=2, # 分割列数 ) # グラフ全体とホバーのフォントサイズ変更 fig.update_layout(font_size=20, hoverlabel_font_size=20) # 2022/1/1のように0埋めを消す fig.update_xaxes(tickformat='%Y/%-m/%-d') # px.timelineの引数textを置く位置を内側の中央に変更 fig.update_traces(textposition='inside', insidetextanchor='middle') fig.show() # グラフ保存 prefix = 'plotly-gantt-charts' # 保存ファイル名の接頭辞 save_name = f"{prefix}_facet_col" pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca' pio.write_html(fig, f"{save_name}.html") pio.write_image(fig, f"{save_name}.png")
プロジェクト管理に役立つ?
ということで、今回はplotly
のpx.timeline
を使用してガントチャートを作成した。ガントチャート自体はプロジェクトの管理に使われているからメジャーなもの。
一方で、メジャーだからこそわざわざplotly
で作成しなくても専用のアプリとかサービスがあるはず。なんならシンプルなグラフだからExcelでもいい。
まあ、これを応用してWebアプリに組み込むとかそういうのができるかもしれないから知っておいて損はない。と思う。
関連記事
-
-
【plolty&棒グラフ】px.barでバーチャートを作成
続きを見る
-
-
【plotly&px.scatter】pxでの散布図の描き方
続きを見る
-
-
【plotly&3D】px.scatter_3dとpx.line_3Dで3Dグラフを作成
続きを見る
-
-
【px&animation】plotly.expressでアニメーションのグラフを作成
続きを見る
-
-
【plotly&棒グラフ】go.Barでバーチャートを作成
続きを見る
-
-
【plotly&go.Scatter】plotlyの散布図グラフの描き方
続きを見る
-
-
【plotly&fill】px.areaで積み上げ塗りつぶし
続きを見る
-
-
【plotly&px.scatter】pxでの散布図の描き方
続きを見る
-
-
【plotly&Scattergl】大量のデータをplotlyで軽くグラフ化
続きを見る
-
-
【plotly&config】グラフのツールバーを編集する
続きを見る