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:
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.
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.
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:
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With