Search code examples
bokeh

Bokeh LabelSet x axis being datetime


I am new to Bokeh and looking for solution to label each data point. Replicating the examples shown in documents, I could not find solutions with X axis being datetime.

import pandas as mypd
from bokeh.models import LabelSet , ColumnarDataSource
from bokeh.plotting import figure, output_file, show

date_1 = ['2020-01-01', '2020-01-02','2020-01-03','2020-01-04','2020-01-05'] 
sal = mypd.DataFrame(date_1)
sal.columns = ["Date_1"]
sal['Sales'] = [15,25,36,17,4]
sal['Date_1'] = mypd.to_datetime(sal['Date_1'])

p= figure(x_axis_type = "datetime")
p.line(x =sal['Date_1'] ,y = sal['Sales'])

lab = LabelSet(x = sal['Date_1'], y = sal['Sales'], text = sal['Sales'])
p.add_layout(lab)

show(p)

It is throwing the error

ValueError: expected an element of either String, Dict(Enum('expr', 'field', 'value', 'transform'), Either(String, Instance(Transform), Instance(Expression), Float)) or Float, got 0   2020-01-01

I understand the error is because x axis take numerical data for labelset. Is my understanding correct ?

If yes what is the workaround ?

I tried with similar queries but could not find a solution for myself.

Similar Query

And this


Solution

  • The simplest solution is to just use a common data source. It also prevents you from embedding the data twice.

    import pandas as pd
    from bokeh.models import LabelSet, ColumnDataSource
    from bokeh.plotting import figure, show
    
    sal = (pd.DataFrame({'Date_1': pd.to_datetime(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05']),
                         'Sales': [15, 25, 36, 17, 4]})
           .set_index('Date_1'))
    
    ds = ColumnDataSource(sal)
    
    p = figure(x_axis_type="datetime")
    p.line(x='Date_1', y='Sales', source=ds)
    
    lab = LabelSet(x='Date_1', y='Sales', text='Sales', source=ds)
    p.add_layout(lab)
    
    show(p)