2015-07-20 33 views
12

Tôi muốn cung cấp khung dữ liệu gấu trúc cho Bokeh để vẽ biểu đồ đường kẻ với nhiều dòng. Trục x phải là df.index và mỗi df.column phải là một dòng riêng biệt.Vẽ nhiều đường với Bokeh và gấu trúc

Đây là những gì tôi wouuld muốn làm:

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) 

Tuy nhiên, tôi nhận được lỗi:

RuntimeError: Missing required glyph parameters: ys 

Thay vào đó, ive được quản lý để làm điều này:

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) 

Đó (không lo lắng) thực hiện công việc nhưng nó sử dụng cùng một màu cho cả 3 dòng, xem bên dưới: enter image description here

Câu hỏi:

1) làm thế nào tôi có thể vượt qua một dataframe gấu trúc để Bokeh của multi_line?

2) Nếu không thể trực tiếp, làm cách nào tôi có thể thao tác dữ liệu khung dữ liệu để multi_line sẽ tạo mỗi dòng có màu khác nhau?

cảm ơn trước

Trả lời

19

Bạn cần cung cấp một danh sách các màu sắc để multi_line. Trong ví dụ của bạn, bạn sẽ làm gì, một cái gì đó như thế này:

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

Dưới đây là một thay đổi mục đích tổng quát hơn ví dụ thứ hai của bạn mà không nhiều hơn hoặc ít hơn những gì bạn đã kết thúc với, nhưng là một chút ngắn gọn hơn và có lẽ hơn 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) 

trong đó sản lượng:

multi_line plot

+2

Lưu ý rằng một nhược điểm nghiêm trọng của việc sử dụng multi_line cho âm mưu cột của một dataframe là rằng nó không phải dễ dàng có thể để thêm một mục huyền thoại cho mỗi cột. Xem [Hỏi đáp này] (http://stackoverflow.com/questions/31419388/bokeh-how-to-add-legend-to-figure-created-by-multi-line-method) – jhin

+0

Có thể thêm chuột không công cụ cho một con số như vậy? –

+0

@NicoleGoebel: điều này có thể được sử dụng: http://stackoverflow.com/questions/31496628/in-bokeh-how-do-i-add-tooltips-to-a-timeseries-chart-hover-tool – bs123

1

Bạn cần phải vẽ một biểu đồ chuỗi thời gian. Điều này sẽ cho phép bạn dễ dàng chèn chú thích. Thuộc tính TimeSeries có thể được đặt trong bokeh._legacy_charts. Hãy xem ví dụ sau đây nằm ở đây:

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

+0

tuyệt vời để thấy rằng cả hai biểu đồ có sẵn trong bokeh và tài liệu của nó vẫn tiếp tục phát triển! Tôi dự định sẽ sớm xem xét lại. – bs123

Các vấn đề liên quan