2016-11-30 2 views
1

Я написал код ниже для создания линейного графика на основе данных из блока данных Pandas. Индекс кадра данных представляет собой временной ряд.Python Bokeh дополнительные задачи оси Y

Код ниже работал хорошо, но я решил добавить еще одну серию данных (из третьего столбца в моем фреймворке, называемом «Col3» в коде). Я хотел, чтобы эта третья серия была на отдельной оси Y. Однако, когда я добавил код для достижения этого, показанный ниже, подсвеченный ***, Боке кажется неспособным создать сюжет. Кто-нибудь знает, что я делаю неправильно?

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 выглядит следующим образом:

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. 
+0

Просьба представить образец 'df' (см [mcve] (http://stackoverflow.com/help/mcve)) –

+0

добавить его к первоначальному вопросу, пожалуйста, –

+0

Образец данных теперь добавляется к исходному вопросу. – pottolom

ответ

1

Несколько вопросов:

Когда вы сделаете это:

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

Вы креатив ng другой y_range по названию Col3 на первой строке. Вы должны использовать это имя во второй строке, а не Performance ratio %. (Или еще лучше, назовите его Performance ratio % на первой строке тоже).

Кроме того, в вашей петле вы помещаете все 3 серии на одну и ту же ось y, вам нужно указать y_range_name='Col3' для третьего.

следующие работы:

numlines = len(df.columns) 

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

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

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


p.line(df.index, df['Col1'], legend = 'Col1', color = mypalette[0]) 
p.line(df.index, df['Col2'], legend = 'Col2', color = mypalette[1]) 

# add extra y axis 
p.extra_y_ranges = {'Performance ratio %': Range1d(start=0, end=50)} 
p.line(df.index, df['Col3'], legend = 'Col3', color = mypalette[2], 
     y_range_name='Performance ratio %') 
p.add_layout(LinearAxis(y_range_name='Performance ratio %'), 'right') 

# creates an output file 
output_file('bokeh.html') 

#save the plot 
show(p) 
+1

Спасибо. Ваши комментарии имеют смысл, и код, который вы предоставили, отлично работает. Очень признателен. – pottolom

Смежные вопросы