Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Plotting multiple lines with Bokeh and pandas

Tags:

I would like to give a pandas dataframe to Bokeh to plot a line chart with multiple lines.

The x-axis should be the df.index and each df.columns should be a separate line.

This is what I would like to do:

import pandas as pd import numpy as np from bokeh.plotting import figure, show  toy_df = pd.DataFrame(data=np.random.rand(5,3), columns = ('a', 'b' ,'c'), index = pd.DatetimeIndex(start='01-01-2015',periods=5, freq='d'))     p = figure(width=1200, height=900, x_axis_type="datetime")  p.multi_line(df) show(p) 

However, I get the error:

RuntimeError: Missing required glyph parameters: ys 

Instead, I've managed to do this:

import pandas as pd import numpy as np from bokeh.plotting import figure, show  toy_df = pd.DataFrame(data=np.random.rand(5,3), columns = ('a', 'b' ,'c'), index = pd.DatetimeIndex(start='01-01-2015',periods=5, freq='d'))     ts_list_of_list = [] for i in range(0,len(toy_df.columns)):     ts_list_of_list.append(toy_df.index)  vals_list_of_list = toy_df.values.T.tolist()  p = figure(width=1200, height=900, x_axis_type="datetime")  p.multi_line(ts_list_of_list, vals_list_of_list) show(p) 

That (ineligantly) does the job but it uses the same color for all 3 lines, see below:

enter image description here

Questions:

1) How can I pass a pandas dataframe to bokeh's multi_line?

2) If not possible directly, how can I manipulate the dataframe data so that multi_line will create each line with a different color?

Thanks in advance.

like image 758
bs123 Avatar asked Jul 20 '15 15:07

bs123


People also ask

Is Bokeh a data visualization library?

Bokeh is a Python library for creating interactive visualizations for modern web browsers. It helps you build beautiful graphics, ranging from simple plots to complex dashboards with streaming datasets. With Bokeh, you can create JavaScript-powered visualizations without writing any JavaScript yourself.


2 Answers

You need to provide a list of colors to multi_line. In your example, you would do, something like this:

p.multi_line(ts_list_of_list, vals_list_of_list, line_color=['red', 'green', 'blue']) 

Here's a more general purpose modification of your second example that does more or less what you ended up with, but is a little more concise and perhaps more Pythonic:

import pandas as pd import numpy as np from bokeh.palettes import Spectral11 from bokeh.plotting import figure, show, output_file output_file('temp.html')  toy_df = pd.DataFrame(data=np.random.rand(5,3), columns = ('a', 'b' ,'c'), index = pd.DatetimeIndex(start='01-01-2015',periods=5, freq='d'))     numlines=len(toy_df.columns) mypalette=Spectral11[0:numlines]  p = figure(width=500, height=300, x_axis_type="datetime")  p.multi_line(xs=[toy_df.index.values]*numlines,                 ys=[toy_df[name].values for name in toy_df],                 line_color=mypalette,                 line_width=5) show(p) 

which yields:

multi_line plot

like image 180
zpbruno Avatar answered Oct 04 '22 21:10

zpbruno


Maintainers note: The bokeh.charts API was deprecated and removed years ago



OBSOLETE:

You need to plot a Time Series chart. This will allow you to easily insert a legend. The TimeSeries attribute is could be located under bokeh._legacy_charts. Please see the following example located here:

http://docs.bokeh.org/en/0.9.3/docs/user_guide/charts.html

like image 45
Hugo Alain Oliva Avatar answered Oct 04 '22 21:10

Hugo Alain Oliva