Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Plot a pandas dataframe using the dataframe index for x coordinate in bokeh

I want to prepare a bokeh plot that uses a ColumnDataSource. The pandas DataFrame that is the source of the data has one column and a datetime index:

enter image description here

How do I specify that the x value should be the index. I tried just omitting it, hoping that would be the default, but it did not work:

enter image description here

There is an ugly solution where I just copy the index as a column in the dataframe, but I hope there is a more elegant solution:

enter image description here enter image description here

like image 629
Krastanov Avatar asked Jun 19 '16 05:06

Krastanov


2 Answers

The issue is that you have to specify which column should be the "x" column. If you don't specify the "x" value, the default behavior in bokeh.plotting is to try to find a column called "x" in your ColumnDataSource (which doesn't exist).

One tricky thing here is that you're using a named index ('timeseries') in pandas. That name is carried over when you create a ColumnDataSource, so that your source probably looks like:

ds = ColumnDataSource(df)
print(ds.data)
# the ts_n values would be the actual timestamps from the df
> {'timestamp': [ts_1, ts_2, ts_3, ts_4, ts_5], 'avg': [0.9, 0.8, 0.7, 0.8, 0.9]}

It would work if you use:

p.line(source=ds, x='timestamps', y='avg')
like image 78
Luke Canavan Avatar answered Oct 18 '22 21:10

Luke Canavan


You can call the index with the usual syntax to get an index from DF as:
p.line(x = df.index.values, y = df['values_for_y'])

like image 39
fmcmac Avatar answered Oct 18 '22 19:10

fmcmac