56237


先日質問でガントチャートの作成事例を指導いただきました。以下のソースで１つ理解できないところがありました。  
ガントチャートの縦軸が数値ではなく、DataFrameの入力データのItemカラムが縦軸にできています。今まで自作したグラフは、縦軸・横軸共に数値もしくは時間のものを扱うことが多かったので、縦軸を文字列にするカラクリを身に付けたいと思っています。  
ご指導よろしくお願いいたします。

[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]


CC BY-SA 4.0
2019-06-29T23:38:43.233
56236
2019-06-30T00:48:43.373
34450
question
python pandas bokeh
Bokeh で作成するグラフの縦軸を数値以外にする方法が分かりません


[figure()](https://bokeh.pydata.org/en/latest/docs/reference/plotting.html#bokeh.plotting.figure.figure)メソッドの`y_range`パラメータ指定ですね。  
以下の`y_range=DF.Item.tolist()`が、DataFrameのItem列(作業名文字列)のリストを指定しています。

[code]

    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')
    
[/code]

前回紹介したオリンピック100mメダリスト記録の表では、`bokeh.sampledata.sprint`からオリンピック開催年を文字列として取り出して指定しています。

[code]

    sprint.Year = sprint.Year.astype(str)
    group = sprint.groupby('Year')
    p = figure(y_range=group, x_range=(9.5,12.7), plot_width=400, plot_height=550, toolbar_location=None,
               title="Time Spreads for Sprint Medalists (by Year)")
    
[/code]

Bokeh GALLERY には同様のグラフが以下のようにいくつかあります。  
[bar_stacked_split.py](https://bokeh.pydata.org/en/latest/docs/gallery/bar_stacked_split.html)  
[ridgeplot.py](https://bokeh.pydata.org/en/latest/docs/gallery/ridgeplot.html)  
[les_mis.py](https://bokeh.pydata.org/en/latest/docs/gallery/les_mis.html)  
[categorical_scatter_jitter.py](https://bokeh.pydata.org/en/latest/docs/gallery/categorical_scatter_jitter.html)  
[categorical.py](https://bokeh.pydata.org/en/latest/docs/gallery/categorical.html)  
[unemployment.py](https://bokeh.pydata.org/en/latest/docs/gallery/unemployment.html)  
[periodic.py](https://bokeh.pydata.org/en/latest/docs/gallery/periodic.html)

ではそれに対するx軸データをどうやって用意・指定しているかは、それぞれのグラフ毎に違うようなので、それぞれのソースを良く見てください。質問のグラフでは以下の部分でしょう。

[code]

    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")
    
[/code]


CC BY-SA 4.0
2019-06-30T00:35:11.040
56237
2019-06-30T00:48:43.373
2019-06-30T00:48:43.373
26370
26370
56236
answer