使用matplotlib来绘制线图 (绘制模拟投资的基金收益情况)
这个函数主要的功能就是将一个result通过图形更加直观的展示出来。
其中主要的知识点是1.子图布局(subplots),2.控制x轴上需要展示的刻度(set_xticks),以及对其的进一步改变(set_xticklabels),3.对图例位置的控制(legend)。 代码如下:
def draw_result(result,point=6,ylim=1):
result_len = len(result['ear_ratio'])
point_to_disp = result_len if point > result_len else point
x_ax = np.arange(result_len)
sep = result_len/point_to_disp
x_ax_index = np.array([math.floor(i*sep)-1 for i in range(1,point_to_disp+1)])
fig,axes = plt.subplots(2,2,figsize=(18,12))
ax =[]
for i in axes:
for j in i:
ax.append(j)
ax[3].set_ylim(-0.6,ylim)
ax[0].plot(x_ax ,result['cost'],label='cost')
for axe,content in zip(ax,['worth','net_worth','ear','ear_ratio']):
axe.set_title(content)
axe.plot(x_ax,result[content],label=content)
axe.set_xticks(x_ax[x_ax_index])
axe.set_xticklabels(np.array([look_time(i) for i in result['optime'][x_ax_index]]))
axe.text(0,max(result[content]),'the last {}:{:.2f}'.format(content,result[content][-1]))
axe.legend(ncol=2,loc=3,bbox_to_anchor=(0,1))
ax[3].text(0,ylim*0.8,'the last {}:{:.2f}'.format('ear_ratio',result['ear_ratio'][-1]))
ax[0].text(0,max(result['worth'])*0.9,'the last {}:{:.2f}'.format('cost',result['cost'][-1]))
for i in [0,2,3]:
ax[i].plot(x_ax ,np.zeros(result_len),ls='--')
ax[1].plot(x_ax,np.ones(result_len),ls='--')
1. 子图布局
fig,axes = plt.subplots(2,2,figsize=(18,12))
fig 是画布对象,axes是一个numpy.array对象。使用的时候可以直接这样
axes[0,0].plot(x,y)
而我此处的用法是将这个2维的axes变成了一个一维的ax,这样做的目的是为了后面循环的时候可以直接和result中的数据一起进行一维的循环,减少代码数量。事实上对于需要绘制的四个图,我把重复的工作都放进了循环里,包括:设置标题,绘图,控制x刻度,添加图例和文本信息
ax =[]
for i in axes:
for j in i:
ax.append(j)
2. 绘制控制轴刻度
这部分分为控制刻度上显示的值,以及刻度的范围
axe.plot(x_ax,result[content],label=content)
axe.set_xticks(x_ax[x_ax_index])
axe.set_xticklabels(np.array([look_time(i) for i in result['optime'][x_ax_index]]))
x_ax是一个numpy.arange生成的array对象,从0到result中值的长度,比如result[‘cost’]的长度为5,则x_ax为np.arange(5)。
x_ax_index是需要展示的x_ax的索引array对象,这是为了直接从x_ax中取需要展示值,又因为x_ax实际上又对应着一个整数类型的时间值,所以可以用这个索引来选取需要展示的时间值,通过一个look_time()函数,选取需要在x轴上展示的时间字符串。
3. 对图例位置的控制
axe.legend(ncol=2,loc=3,bbox_to_anchor=(0,1))
axe.legend()的参数:
ncol:控制图例展开成几列,因为默认情况下,所有图例都在一列。
loc:控制图例的展示位置,这里表示在左下角,实际上这儿配合上bbox_to_anchor这个参数,将图例在axe外部展示
bbox_to_anchor=(x,y):控制图例展示的位置,x,y均为在图中位置的比例,此处(0,1)表示在左上角
至于图例的内容,则是在plot(label=‘content’)的label参数来设置的。
|