Python Bokeh附加Y轴问题

时间:2016-11-30 21:42:48

标签: python pandas plot dataframe bokeh

我编写了下面的代码,根据Pandas数据帧中的数据生成折线图。数据帧的索引是一个时间序列。

下面的代码运行良好,但我决定再添加一个数据系列(来自我的数据框中的第三列,在代码中称为“Col3”)。我希望第三个系列在一个单独的Y轴上。但是,当我添加代码来实现这一点时,由***突出显示如下,Bokeh似乎无法生成情节。有谁知道我做错了什么?

from bokeh.plotting import figure, output_file, show, save
from bokeh.models import ColumnDataSource
from bokeh.models import Range1d, LinearAxis
import pandas as pd
from pandas import HDFStore
from bokeh.palettes import Spectral11

store = pd.HDFStore(<dataframe location>)
df = pd.DataFrame(store['d1'])
df = df.rename_axis('Time')
df.fillna(0)

numlines = len(df.columns)

#import colour pallete
mypalette = Spectral11[0:numlines]

# remove unwanted columns
col_list = ['Col1', 'Col2', 'Col3']
df = df[col_list]

# make a list of our columns
col = []
[col.append(i) for i in df.columns]

# make the figure, 
p = figure(x_axis_type="datetime", title="<Plot Title>", width = 800, height = 450)
p.xaxis.axis_label = 'Date'
p.yaxis.axis_label = '<Name of Primary Y Axis>'

*** # add extra y axis
p.extra_y_ranges = {'Col3': Range1d(start=0, end=0.25)}
p.add_layout(LinearAxis(y_range_name='Performance ratio %'), 'right') ***

# loop through our columns and colors
for (columnnames, colore) in zip(col, mypalette):
p.line(df.index, df[columnnames], legend = columnnames, color = colore )

# creates an output file 
output_file('<outputlocation>')

#save the plot
save(p)

供参考,我的数据框如下所示:

Dataframe看起来像这样:

      Time          Col1     Col2     Col3     Col4
29/11/2016 00:00    4        41       41        55
29/11/2016 01:00    55       15       61        81
29/11/2016 02:00    51       75       2         4
29/11/2016 03:00    21       21       51        9
etc.

1 个答案:

答案 0 :(得分:1)

一些问题:

执行此操作时:

p.extra_y_ranges = {'Col3': Range1d(start=0, end=0.25)}
p.add_layout(LinearAxis(y_range_name='Performance ratio %'), 'right')

您在第一行创建另一个名为y_range的{​​{1}}。您需要在第二行使用此名称,而不是Col3。 (或者更好的是,也可以在第一行命名为Performance ratio %。)

此外,在循环中,将所有3个系列放在同一个y轴上,您需要为第三个指定Performance ratio %

以下作品:

y_range_name='Col3'