2013-09-25 148 views
2

我試圖用Interactive Brokers的數據實時繪製matplotlib.finance的燭臺圖。有沒有人有一個簡單的例子,這樣做?我能做到這一點使用一個簡單的線圖,其中沿着實時燭臺圖(matplotlib)

class Data: 
    def __init__(self, maxLen=50): 
     self.maxLen = maxLen 
     self.x_data = np.arange(maxLen) 
     self.y_data = deque([], maxLen) 

    def add(self, val): 
     self.y_data.append(val) 

class Plot: 
    def __init__(self, data): 
     plt.ion() 
     self.ayline, = plt.plot(data.y_data) 
     self.ayline.set_xdata(data.x_data) 

    def update(self, data): 
     self.ayline.set_ydata(data.y_data) 
     plt.draw() 

if __name__ == "__main__": 
    data = Data() 
    plot = Plot(data) 

    while 1: 
     data.add(np.random.randn()) 
     plot.update(data) 
     sleep(1) 

線的東西我怎樣才能改變這陰陽燭圖的,而不是提供5元組的y值?

+0

不知道我真的明白你在問什麼。你想添加新的蠟燭棒還是隻需要更新一個標記?在1.4'matplotlib.finance'中也會注意到一個重要的重構因子,所以參數順序更符合約定。 (1.4還沒有出來,變化在開發分支) – tacaswell

+0

是的主要想法是增加新的燭臺。不過,每次打勾時最好更新最新版本。 – Morten

+0

您還需要獲取時間(使用dt = datetime.datetime.utcnow())並將其轉換爲unix時間戳。使用模數(隨時間表)知道何時添加新蠟燭。 – working4coins

回答

4

我剛剛得到了類似的工作。爲了更簡單地說明該方法,我修改了matplotlib站點中的finance_demo示例。

#!/usr/bin/env python 
import matplotlib.pyplot as plt 
from matplotlib.dates import DateFormatter, WeekdayLocator, HourLocator, \ 
    DayLocator, MONDAY 
from matplotlib.finance import quotes_historical_yahoo, candlestick,\ 
    plot_day_summary, candlestick2 


# make plot interactive in order to update 
plt.ion() 

class Candleplot: 
    def __init__(self): 
     fig, self.ax = plt.subplots() 
     fig.subplots_adjust(bottom=0.2) 

    def update(self, quotes, clear=False): 

     if clear: 
      # clear old data 
      self.ax.cla() 

     # axis formatting 
     self.ax.xaxis.set_major_locator(mondays) 
     self.ax.xaxis.set_minor_locator(alldays) 
     self.ax.xaxis.set_major_formatter(weekFormatter) 

     # plot quotes 
     candlestick(self.ax, quotes, width=0.6) 

     # more formatting 
     self.ax.xaxis_date() 
     self.ax.autoscale_view() 
     plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right') 

     # use draw() instead of show() to update the same window 
     plt.draw() 


# (Year, month, day) tuples suffice as args for quotes_historical_yahoo 
date1 = (2004, 2, 1) 
date2 = (2004, 4, 12) 
date3 = (2004, 5, 1) 

mondays = WeekdayLocator(MONDAY)  # major ticks on the mondays 
alldays = DayLocator()    # minor ticks on the days 
weekFormatter = DateFormatter('%b %d') # e.g., Jan 12 
dayFormatter = DateFormatter('%d')  # e.g., 12 

quotes = quotes_historical_yahoo('INTC', date1, date2) 

plot = Candleplot() 
plot.update(quotes) 

raw_input('Hit return to add new data to old plot') 

new_quotes = quotes_historical_yahoo('INTC', date2, date3) 

plot.update(new_quotes, clear=False) 

raw_input('Hit return to replace old data with new') 

plot.update(new_quotes, clear=True) 

raw_input('Finished') 

基本上,我用plt.ion()打開交互模式,以便在程序繼續運行時可以更新繪圖。要更新數據,似乎有兩種選擇。 (1)您可以再次使用新數據調用燭臺(),這會將其添加到繪圖而不影響先前繪製的數據。這可能更適合於添加一個或多個新蠟燭到最後;只是通過一個包含新蠟燭的列表。 (2)使用ax.cla()(清除軸)在傳遞新數據之前刪除所有先前的數據。如果你想要一個移動的窗口,例如只繪製最後50個蠟燭,因爲只要在最後添加新的蠟燭就會導致越來越多的蠟燭積聚在情節中。同樣,如果您想在關閉前更新最後一個蠟燭,則應該先清除舊數據。清除軸也會清除一些格式,因此應該設置函數以在調用ax.cla()後重復軸的格式。

不確定這個問題是否仍然與原始海報有關,但希望這有助於某人。