2016-06-09 20 views
5

Tôi muốn tạo trực quan hóa khi có hai biểu đồ đường được cập nhật với một điểm mới trên mỗi biểu đồ đường mỗi giây. Kết quả sẽ là một cái gì đó như this.Truyền trực tuyến hai biểu đồ đường bằng cách sử dụng bokeh

Gần đây tôi đã đọc về bokeh và phát hiện ra rằng nó có thể được sử dụng để hiển thị các luồng dữ liệu theo thời gian thực. Tuy nhiên không biết làm thế nào để mã trong nó được nêu ra.

Tôi sẽ đánh giá cao nếu ai đó có thể chỉ cho tôi cách thực hiện tác vụ này bằng cách sử dụng bokeh. cảm ơn!

Trả lời

11

Đối bokeh-0.11.1:

Về cơ bản, bạn cần phải chạy ứng dụng bạn python trong máy chủ bokeh. Sau đó, bất kỳ ai cũng có thể kết nối với máy chủ và xem biểu đồ trong thời gian thực.

Trước tiên, hãy viết chương trình của bạn. Sử dụng mã này ví dụ:

# myplot.py 
from bokeh.plotting import figure, curdoc 
from bokeh.driving import linear 
import random 

p = figure(plot_width=400, plot_height=400) 
r1 = p.line([], [], color="firebrick", line_width=2) 
r2 = p.line([], [], color="navy", line_width=2) 

ds1 = r1.data_source 
ds2 = r2.data_source 

@linear() 
def update(step): 
    ds1.data['x'].append(step) 
    ds1.data['y'].append(random.randint(0,100)) 
    ds2.data['x'].append(step) 
    ds2.data['y'].append(random.randint(0,100)) 
    ds1.trigger('data', ds1.data, ds1.data) 
    ds2.trigger('data', ds2.data, ds2.data) 

curdoc().add_root(p) 

# Add a periodic callback to be run every 500 milliseconds 
curdoc().add_periodic_callback(update, 500) 

Sau đó chạy các máy chủ từ dòng lệnh, với chương trình của bạn:

C:\>bokeh serve --show myplot.py 

này sẽ mở trình duyệt với đồ thị thời gian thực của bạn.

Để biết tất cả chi tiết, hãy xem bokeh server documentation.

+4

Vì lý do kỹ thuật khá khó hiểu, thường được ưu tiên cập nhật toàn bộ thuộc tính '.data'" cùng một lúc "tức là' ds.data = new_data' nếu bạn có thể. Ngoài ra nếu bạn làm theo cách đó, các cuộc gọi 'trigger' là không cần thiết, máy chủ Bokeh sẽ nhận các thay đổi đối với toàn bộ thuộc tính một cách tự động. – bigreddot

+0

Làm cách nào để chỉ hiển thị các điểm X cuối cùng thay vì ép tất cả tập dữ liệu? –

+0

'.stream' chấp nhận tham số' rollover' cho biết số điểm cần giữ ở mức tối đa, trước khi giảm điểm. – bigreddot

4

Bạn có thể thêm di chuyển để đồ thị của bạn bằng cách thêm dòng sau vào phần khai báo con số âm mưu:

p = figure(plot_width=400, plot_height=400) 
p.x_range.follow="end" 
p.x_range.follow_interval = 20 
p.x_range.range_padding=0 

nơi follow_interval = số điểm tích lũy mà trên trên đồ thị trước khi nó bắt đầu di chuyển. Tôi tin rằng bạn cũng có thể đặt phạm vi hiển thị trên biểu đồ. FYI Tôi nhận được mã cuộn từ ví dụ OHLC trên trang GitHub bokeh được tìm thấy tại đây: https://github.com/bokeh/bokeh/tree/master/examples/app OHLC là ví dụ về dữ liệu trực tuyến sử dụng kỹ thuật "... = new_data" mà bigreddot đề cập.

+0

bổ sung tốt đẹp vào câu trả lời ở trên. – Tommy

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