我刚刚成功实现了类似的功能。为了更简单地说明这种方法,我修改了matplotlib网站上的finance_demo示例。
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
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:
self.ax.cla()
self.ax.xaxis.set_major_locator(mondays)
self.ax.xaxis.set_minor_locator(alldays)
self.ax.xaxis.set_major_formatter(weekFormatter)
candlestick(self.ax, quotes, width=0.6)
self.ax.xaxis_date()
self.ax.autoscale_view()
plt.setp( plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
plt.draw()
date1 = ( 2004, 2, 1)
date2 = ( 2004, 4, 12 )
date3 = ( 2004, 5, 1 )
mondays = WeekdayLocator(MONDAY)
alldays = DayLocator()
weekFormatter = DateFormatter('%b %d')
dayFormatter = DateFormatter('%d')
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)您可以再次调用candlestick()并传入新数据,这将在不影响先前绘制的数据的情况下将其添加到绘图中。这可能更适合向结尾添加一个或多个新蜡烛;只需传递包含新蜡烛的列表即可。(2)使用ax.cla()(清除轴)在传递新数据之前删除所有先前的数据。如果要移动窗口(例如,仅绘制最后50个蜡烛),则应优先选择此选项,因为仅向末尾添加新蜡烛将导致越来越多的蜡烛在图表中累积。同样,如果要更新最后一个蜡烛,在它关闭之前,您应该首先清除旧数据。清除轴也会清除一些格式设置,因此应设置函数以在调用ax.cla()后重复轴的格式设置。
不确定问题是否仍然与原始发布者相关,但希望这对某人有所帮助。
matplotlib.finance
将进行重大重构,以更好地匹配约定的参数顺序。(1.4版本尚未发布,更改在开发分支上进行) - tacaswell