#参考:
#https://www.cnblogs.com/JuliaZhao/p/12034202.html
#简单示例(筹码分布图)
#%% 筹码分布图
#import mpl_finance as mpf
#import matplotlib.finance as mpf
import matplotlib.pyplot as plt
from matplotlib.finance import candlestick2_ohlc
cdata=DataAPI.MktEqudAdjGet(ticker=u"301037" , beginDate="20220101",endDate="20220602",tradeDate=u"",\
isOpen="1",field=u"ticker,secShortName,tradeDate,highestPrice,lowestPrice,openPrice,closePrice,turnoverRate,preClosePrice,turnoverVol,turnoverValue",pandas="1")
#按日期倒排序(最近在前),为了计算到今天endDate总的换手率大致到1(全部换手)开始那天
#均价
cdata['mean']=cdata.apply(lambda x:x.turnoverValue/x.turnoverVol, axis = 1)
cdata=cdata.sort(["tradeDate"],ascending=False)
print cdata.head()
#对换手率累计求和
cdata['turnoverRate_cumsum'] = cdata.turnoverRate.cumsum()
#只取近似全换手(<=1)前的数据,多的不要
cdata=cdata[cdata.turnoverRate_cumsum<=1.0]
#再按日期正排序
cdata=cdata.sort(["tradeDate"],ascending=True)
#再对换手率累计求和
cdata['turnoverRate_cumsum'] = cdata.turnoverRate.cumsum()
#必须重新排序,为了画K线图看到横坐标刻度
cdata=cdata.reset_index(drop=True)
print cdata.tail()
cdata=cdata.rename(columns={'tradeDate':'datetime','openPrice':'open','closePrice':'close','highestPrice':'high', 'lowestPrice':'low', 'turnoverVol':'volume','turnoverValue':'money'})
#print cdata.head(10)
cdata=cdata[['datetime','open','high','low','close','mean','volume','money']]
pricelst = sorted(set(list(cdata['mean'])))
volumelst = []
moneylst = []
#简单筹码分布
for i in pricelst:
volumelst.append(cdata[cdata['mean'] == i]['volume'].sum())
moneylst.append(cdata[cdata['mean'] == i]['money'].sum())
# 绘制
fig = plt.figure(figsize=(30, 10),dpi=100)
ax1 = plt.subplot2grid((1, 4), (0, 0))
ax2 = plt.subplot2grid((1, 4), (0, 1), colspan=3,sharey=ax1)
xlabel = pricelst
#print len(pricelst),pricelst
#print moneylst
ax1.barh(xlabel,moneylst,height=0.05,alpha=0.16) # 直方图
#mpf.candlestick2_ochl(ax2,cdata['open'],cdata['close'],cdata['high'],cdata['low'],
# width=0.8, colorup='red', colordown='blue',alpha=1.0) # K线图 z 这不对样
ax2.axes.get_yaxis().set_visible(False)#y轴不可见
candlestick2_ohlc(ax2,
cdata['open'].values,
cdata['high'].values,
cdata['low'].values,
cdata['close'].values,
width=0.4,
colorup='r',
colordown='b',
alpha=1)
ax2.set_xticks(range(0,len(cdata), 5)) #X轴刻度设定 每5天标一个日期
#修饰图片
# X-轴每个ticker标签都向右倾斜45度
print "ax2.get_xticks:",ax2.get_xticks()
for label in ax2.xaxis.get_ticklabels():
label.set_rotation(45)
label.set_fontsize(10) # 设置标签字体
ax2.set_xticklabels([cdata.ix[index, 'datetime'] for index in ax2.get_xticks()])