使用matplotlib 可以汇制行情图(为方便取数据,这里行情源还是用的tushare),不过在汇图的时候想要使用时间作为x列,格式“2017-01-01”这种格式,发现只有bar类型的图可以正常在下面显示出时间序列,其他像折线图,k线图等都不能正常显示时间序列。后来研究发现在使用时间作为X轴序列时,需要使用matplotlib.dates 方法里的date2num 函数将时间转化为数字类型才可以正常显示。而对于k线图,可以使用import matplotlib.finance as mpf 方法进行汇制。开始之前可以先认识下k线,这个是日本幕府时候被发明的,又称蜡烛图,分阳线和阴线。具体见下图:

kline
kline

这里使用lambda实现时间转换的方法如下:

 1%matplotlib inline
 2import matplotlib.pyplot as plt
 3import matplotlib.finance as mpf
 4from dateutil import parser
 5import matplotlib.dates as mpl_dt
 6import tushare as ts
 7start = '2017-02-01'
 8end = '2017-03-01'
 9df = ts.get_hist_data('sh', start=start, end=end)
10DATA = df[['open', 'high', 'close', 'low', 'volume']]
11DATA = DATA.reset_index()
12DATA["date"]  = DATA["date"].apply(lambda x : mpl_dt.date2num(parser.parse(x)))
13#print(DATA)
14fig, ax = plt.subplots()
15mpf.candlestick_ohlc(ax, DATA.values, width=0.6, colorup='r', colordown='g')
16plt.grid(True)
17#设置x轴为时间
18ax.xaxis_date()
19ax.autoscale_view()
20plt.setp(plt.gca().get_xticklabels(), rotation=30)
21plt.show()

出图结果如下:

plt-kline
plt-kline

也可以通过一步步的转换时间,同时也可以加上title和x标签和y标签,代码如下:

 1%matplotlib inline
 2from matplotlib.pylab import date2num
 3import matplotlib.pyplot as plt
 4import matplotlib.finance as mpf
 5import datetime
 6import tushare as ts
 7# 对tushare获取到的数据转换成candlestick_ohlc()方法可读取的格式
 8data_list = []
 9hist_data = ts.get_hist_data('600199')
10for dates,row in hist_data.iterrows():
11    # 将时间转换为数字
12    date_time = datetime.datetime.strptime(dates,'%Y-%m-%d')
13    t = date2num(date_time)
14    open,high,low,close = row[:4]
15    datas = (t,open,high,low,close)
16    data_list.append(datas)
17# 创建子图
18fig, ax = plt.subplots()
19fig.subplots_adjust(bottom=0.2)
20# 设置X轴刻度为日期时间
21ax.xaxis_date()
22plt.xticks(rotation=45)
23plt.yticks()
24plt.title("股票代码:601558两年K线图")
25plt.xlabel("时间")
26plt.ylabel("股价(元)")
27mpf.candlestick_ohlc(ax,data_list,width=1.5,colorup='r',colordown='green')
28plt.grid()