2021-08-29 使用matplotlib来绘制线图

使用matplotlib来绘制线图 (绘制模拟投资的基金收益情况)

这个函数主要的功能就是将一个result通过图形更加直观的展示出来。

其中主要的知识点是1.子图布局(subplots),2.控制x轴上需要展示的刻度(set_xticks),以及对其的进一步改变(set_xticklabels),3.对图例位置的控制(legend)。
代码如下:

def draw_result(result,point=6,ylim=1):
#     result是模拟投资后产生的数据集,是一个字典,其中包含cost, worth, net_worth, ear, ear_ratio, optime, share等,对于涨卖跌买的结果,还含有cash
# point 是表明图中需要展示在x轴上刻度的数目,默认为6
#     ylim  是控制ear_ratio一图y坐标范围的上限
    result_len = len(result['ear_ratio']) # 获取数据长度,result中每个值的长度都是一样的,这里选ear_ratio
    point_to_disp = result_len if point > result_len else point
    x_ax = np.arange(result_len) # x轴上的数据
    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])
        # look_time(inttime)这个函数是传入一个日期整数值,返回相应的日期字符串
        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))
# 表示创建一个画布,其中含有2x2的子图,画布的大小是18x12英寸

fig 是画布对象,axes是一个numpy.array对象。使用的时候可以直接这样

axes[0,0].plot(x,y) 
#左上角的图axes[1,0]是左下角的图,这个索引跟numpy.array是一样的

而我此处的用法是将这个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])
        # look_time(inttime)这个函数是传入一个日期整数值,返回相应的日期字符串
        axe.set_xticklabels(np.array([look_time(i) for i in result['optime'][x_ax_index]]))
        #我希望能尽量均匀的选取6个点来展示,所以用了x_ax_index这个索引array,他是通过设定需要展示的刻度数(此处为6),根据数据长度,设定步长,计算出来的,所以展示出来的刻度会有些许不等距。

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参数来设置的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值