56126


python初級者です。  
python 、plotlyでガントチャートを作成し、しばしば利用しています。  
しかし、tooltipが柔軟でなく、工夫の余地がなさそうです。

Bokehはtooltipが柔軟で、表示させる内容は自由にカスタマイズできます。

しかし、ガントチャートを作れるのかが分かりません。

ご指導よろしくお願いいたします。


CC BY-SA 4.0
2019-06-26T12:28:50.667
56114
2019-06-27T00:31:41.973
34450
question
python bokeh
Bokeh で　ガントチャートを作ることはできるでしょうか？


出来ると言えば出来るでしょう。以下の記事の2つ目の回答が、Bokehでガントチャートを表示する内容になっています。  
ただし、表示内容はシンプルですね。  
色々と付加情報表示にこだわるなら、それは別途ということでしょうか。  
[How to plot stacked event duration (Gantt Charts) using Python
Pandas?](https://stackoverflow.com/q/31820578/9014308)

この回答の後で仕様変更になって、`bokeh.charts`はサポートされなくなったようですが、コメントアウトすれば動作しました。  
回答プログラムの2行コメントアウト・2行数値調整で、ほぼ同様の結果が出来ています。

[code]

    from bokeh.plotting import figure, show, output_notebook, output_file
    from bokeh.models import ColumnDataSource, Range1d
    from bokeh.models.tools import HoverTool
    from datetime import datetime
    #from bokeh.charts import Bar  # コメントアウト
    #output_notebook()             # コメントアウト
    #output_file('GanntChart.html') #use this to create a standalone html file to send to others
    import pandas as ps
    
    DF=ps.DataFrame(columns=['Item','Start','End','Color'])
    Items=[
        ['Contract Review & Award','2015-7-22','2015-8-7','red'],
        ['Submit SOW','2015-8-10','2015-8-14','gray'],
        ['Initial Field Study','2015-8-17','2015-8-21','gray'],
        ['Topographic Procesing','2015-9-1','2016-6-1','gray'],
        ['Init. Hydrodynamic Modeling','2016-1-2','2016-3-15','gray'],
        ['Prepare Suitability Curves','2016-2-1','2016-3-1','gray'],
        ['Improvement Conceptual Designs','2016-5-1','2016-6-1','gray'],
        ['Retrieve Water Level Data','2016-8-15','2016-9-15','gray'],
        ['Finalize Hydrodynamic Models','2016-9-15','2016-10-15','gray'],
        ['Determine Passability','2016-9-15','2016-10-1','gray'],
        ['Finalize Improvement Concepts','2016-10-1','2016-10-31','gray'],
        ['Stakeholder Meeting','2016-10-20','2016-10-21','blue'],
        ['Completion of Project','2016-11-1','2016-11-30','red']
        ] #first items on bottom
    
    for i,Dat in enumerate(Items[::-1]):
        DF.loc[i]=Dat
    
    #convert strings to datetime fields:
    DF['Start_dt']=ps.to_datetime(DF.Start)
    DF['End_dt']=ps.to_datetime(DF.End)
    
    G=figure(title='Project Schedule',x_axis_type='datetime',width=800,height=400,y_range=DF.Item.tolist(),
            x_range=Range1d(DF.Start_dt.min(),DF.End_dt.max()), tools='save')
    
    hover=HoverTool(tooltips="Task: @Item<br>\
    Start: @Start<br>\
    End: @End")
    G.add_tools(hover)
    
    DF['ID']=DF.index+0.3   # 数値調整 元は 0.8
    DF['ID1']=DF.index+0.7  # 数値調整 元は 1.2
    CDS=ColumnDataSource(DF)
    G.quad(left='Start_dt', right='End_dt', bottom='ID', top='ID1',source=CDS,color="Color")
    #G.rect(,"Item",source=CDS)
    show(G)
    
[/code]

[![Bokehガントチャート](https://i.stack.imgur.com/RGxIL.png)](https://i.stack.imgur.com/RGxIL.png)

* * *

Bokehライブラリ説明サイトの GALLERY に、類似の形でオリンピック100mメダリスト記録の変遷が図になっています。  
これもシンプルですね。  
[bar_intervals.py](https://bokeh.pydata.org/en/latest/docs/gallery/bar_intervals.html)

* * *

Python gantt chartで簡単に検索した中では、色々な情報をスケジュールの線と同時に表示するなら、Bokehよりも以下の2つが良さそうです。

  * [Python-Gantt](https://xael.org/pages/python-gantt-en.html)
  * [stefanSchinkel/gantt](https://github.com/stefanSchinkel/gantt)

まあ、お使いの plotly とか、他に matplotlib なんかも以下のような例があります。

  * [Pythonライブラリ「plotly」でガントチャートを表示する](https://maruzhang.hatenablog.com/entry/2019/05/01/143718)
  * [Quick Gantt Chart with Matplotlib](https://sukhbinder.wordpress.com/2016/05/10/quick-gantt-chart-with-matplotlib/)


CC BY-SA 4.0
2019-06-27T00:31:41.973
56126
2019-06-27T00:31:41.973
26370
56114
answer