经典股票价格图表包含一条垂直线,连接每个时间段的最高价和最低价,左侧为开盘价(第一个),右侧为收盘价(最后一个价).
Matplotlib可以绘制日文版,称为烛台,但我无法找到西方版本的解决方案,简称为“条形图”. Matplotlib可以绘制这样的图表吗?
解决方法
调整matplotlib财务包(
documentation,code)中的烛台功能:
def westerncandlestick(ax,quotes,width=0.2,colorup='k',colordown='r',ochl=True,linewidth=0.5): """ Plot the time,open,high,low,close as a vertical line ranging from low to high. Use a rectangular bar to represent the open-close span. If close >= open,use colorup to color the bar,otherwise use colordown Parameters ---------- ax : `Axes` an Axes instance to plot to quotes : sequence of quote sequences data to plot. time must be in float date format - see date2num (time,close,...) vs (time,...) set by `ochl` width : float fraction of a day for the open and close lines colorup : color the color of the lines close >= open colordown : color the color of the lines where close < open ochl: bool argument to select between ochl and ohlc ordering of quotes linewidth: float linewidth of lines Returns ------- ret : tuple returns (lines,openlines,closelines) where lines is a list of lines added """ OFFSET = width / 2.0 lines = [] openlines = [] closelines = [] for q in quotes: if ochl: t,low = q[:5] else: t,close = q[:5] if close >= open: color = colorup else: color = colordown vline = Line2D( xdata=(t,t),ydata=(low,high),color=color,linewidth=linewidth,antialiased=True) lines.append(vline) openline = Line2D(xdata=(t - OFFSET,ydata=(open,open),antialiased=True) openlines.append(openline) closeline = Line2D(xdata=(t,t+OFFSET),ydata=(close,close),antialiased=True) closelines.append(closeline) ax.add_line(vline) ax.add_line(openline) ax.add_line(closeline) ax.autoscale_view() return lines,closelines
叫它,例如像这样:
westerncandlestick(ax,width=0.6,linewidth=1.44,ochl=False)
当然,您可以使用colorup和colordown参数调整颜色.
完成上述情节的完整代码:
import matplotlib.pyplot as plt from matplotlib.finance import quotes_historical_yahoo_ohlc from matplotlib.lines import Line2D def westerncandlestick(ax,linewidth=0.5): """ Plot the time,close as a vertical line ranging from low to high. Use a rectangular bar to represent the open-close span. If close >= open,otherwise use colordown Parameters ---------- ax : `Axes` an Axes instance to plot to quotes : sequence of quote sequences data to plot. time must be in float date format - see date2num (time,...) vs (time,...) set by `ochl` width : float fraction of a day for the open and close lines colorup : color the color of the lines close >= open colordown : color the color of the lines where close < open ochl: bool argument to select between ochl and ohlc ordering of quotes linewidth: float linewidth of lines Returns ------- ret : tuple returns (lines,closelines) where lines is a list of lines added """ OFFSET = width / 2.0 lines = [] openlines = [] closelines = [] for q in quotes: if ochl: t,low = q[:5] else: t,close = q[:5] if close >= open: color = colorup else: color = colordown vline = Line2D( xdata=(t,antialiased=True) lines.append(vline) openline = Line2D(xdata=(t - OFFSET,antialiased=True) openlines.append(openline) closeline = Line2D(xdata=(t,antialiased=True) closelines.append(closeline) ax.add_line(vline) ax.add_line(openline) ax.add_line(closeline) ax.autoscale_view() return lines,closelines from matplotlib.dates import DateFormatter,WeekdayLocator,\ DayLocator,MONDAY # (Year,month,day) tuples suffice as args for quotes_historical_yahoo date1 = (2004,2,1) date2 = (2004,4,12) 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_ohlc('INTC',date1,date2) if len(quotes) == 0: raise SystemExit fig,ax = plt.subplots() fig.subplots_adjust(bottom=0.2) ax.xaxis.set_major_locator(mondays) ax.xaxis.set_minor_locator(alldays) ax.xaxis.set_major_formatter(weekFormatter) westerncandlestick(ax,ochl=False) ax.xaxis_date() ax.autoscale_view() plt.setp(plt.gca().get_xticklabels(),rotation=45,horizontalalignment='right') plt.show()