2015-10-04 81 views
3

我在實驗中使用散景來實時繪製數據,並且該庫提供了一種方便的方法來執行此操作。根據實時繪圖中的值更改點顏色使用散景

這裏我的代碼片段來完成這項任務:

# do the imports 
import pandas as pd 
import numpy as np 
import time 
from bokeh.plotting import * 
from bokeh.models import ColumnDataSource 

# here is simulated fake time series data 
ts = pd.date_range("8:00", "10:00", freq="5S") 
ts.name = 'timestamp' 
ms = pd.Series(np.arange(0, len(ts)), index=ts) 
ms.name = 'measurement' 
data = pd.DataFrame(ms) 
data['state'] = np.random.choice(3, len(ts)) 
data['observation'] = np.random.choice(2, len(ts)) 
data.reset_index(inplace=True) 
data.head() 

這是數據的樣子。 simulated data

接下來,我使用了下列剪斷將數據發送到服務器中實時

output_server("observation") 

p = figure(plot_width=800, plot_height=400, x_axis_type="datetime") 
x = np.array(data.head(2).timestamp, dtype=np.datetime64) 
y = np.array(data.head(2).observation) 
p.diamond_cross(x,y, size=30, fill_color=None, line_width=2,  name='observation') 
show(p) 

renderer = p.select(dict(name="observation"))[0] 
ds = renderer.data_source 

for mes in range(len(data)): 

    x = np.append(x, np.datetime64(data.loc[mes].timestamp)) 
    y = np.append(y, np.int64(data.loc[mes].observation)) 
    ds.data["x"] = x 
    ds.data["y"] = y 

    ds._dirty = True 
    cursession().store_objects(ds) 
    time.sleep(.1) 

這將產生一個非常不錯的結果,但是我需要改變空調的每個數據點的顏色一個值。

在這種情況下,條件是需要三個值 - 0,1和2的狀態變量。所以我的數據應該能夠反映這一點。 我花了幾個小時試圖弄清楚(坦承我是一個非常新的散景),任何幫助將不勝感激。

my data time series

回答

0

當推數據,則具有由期望的顏色分離的組,然後提供相應的顏色的調色板。有幾個變體較長的討論在https://github.com/bokeh/bokeh/issues/1967,如簡單的boteh.charts點例如bryevdv張貼在2月28日:

cat = ['foo', 'bar', 'baz'] 
xyvalues=dict(x=[1,4,5], y=[2,7,3], z=[3,4,5]) 
dots = Dot(
    xyvalues, cat=cat, title="Data", 
    ylabel='FP Rate', xlabel='Vendors', 
    legend=False, palette=["red", "green", "blue"]) 
show(dots) 

請記得閱讀並遵守發帖準則在https://stackoverflow.com/help/how-to-ask;我在第一次搜索嘗試中發現了這個以及其他幾個潛在的有用點擊,「Bokeh」改變了顏色「情節」。如果這些解決方案都不能解決您的問題,則需要將您正在做的和已有答案區分開來。

+0

謝謝。我正在查看答案,但沒有一個提供關於如何去做的提示_real_time_。在你的例子中,你正在操作Dot對象,你可以提供調色板。在我的情況下,動作發生在我正在更新數據源對象的循環中。看起來數據源對象允許僅更新數據而不更新顏色。也許,我仍然錯過了一些明顯的東西,但我一直無法弄清楚。關鍵是對每個傳入數據點進行實時處理。 –

+0

您是否需要在繪製點後重新分類點,還是僅僅需要添加顏色?你有一個上限,可以讓你指定一個人工大的調色板,但只使用你需要的顏色,當你走?你能負擔得起重繪擴大的數據集? – Prune

+0

我需要隨時添加顏色。在上面我模擬數據的例子中,所有數據點都可以預先獲得,但是在真實系統中,情況並非如此。是的,我可以負擔重新繪製擴展數據集,因爲我將保持最大的窗口。您是否建議爲每個傳入數據點創建一個新的Dot對象(或任何繪圖對象),而不是更新DataSource對象?如果是這樣的話,我會試一試......謝謝 –