900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > matplotlib横坐标轴为日期画股价走势图 自定义限制刻度值数量避免太多重叠

matplotlib横坐标轴为日期画股价走势图 自定义限制刻度值数量避免太多重叠

时间:2019-10-15 22:35:33

相关推荐

matplotlib横坐标轴为日期画股价走势图 自定义限制刻度值数量避免太多重叠

滚爬出一种简单能用的办法,matplotlib文档真是简要得让人头秃……

场景

根据原始数据.csv画一段股价走势图,要求以日期作为横坐标,原始数据内包含日期、时间、最高价、最低价,大致如下图所示。

一、读取和整理数据

用Pandas读取csv,截取出需要作图的行区域。

import pandas as pdimport matplotlib.pyplot as pltfrom datetime import datetime#打开数据f = open(原始数据.csv)data = pd.read_csv(f)#列重命名new_col = [date, ime,H,L]data.columns = new_col#选择需要作图的行数,stt和edd分别是开始行和结束行,用切片方式选择stt,edd = 938,1000data = data.iloc[stt:edd+1]#将行索引还原成默认值,即从0开始步长为1的数组,原来的索引直接删除data = data.reset_index(drop=True)

二、作图

1.画出基础图形

定义一个作图用的函数,方便后续调用。

def gujiatu(data):fig,ax = plt.subplots()tx = 0for indexs in data.index:v = data.loc[indexs].valuesH,L = v[2],v[3]ax.vlines(tx+1,H,L,color=#000000)tx += 1plt.savefig(结果图片.png)plt.show()#如果不需要直接展示,可以注释掉这条

这里横坐标是从1开始的连续数字,保证线与线之间是相同的间隔。之所以不直接使用原始数据中的日期列,是因为日期列存在重复,每个日期都对应多根线条,画图时会重合在一起。如果使用日期+时间,是可以保证唯一性,但转化成datetime做横坐标时,时间间隔其实是不太统一的(比如15:00-21:30有一段空白),而且最终展示并没有要求横坐标刻度精确到时间,这样刻度值会太长,不实用也不美观。初步画图效果如下:

2.数据横坐标转为日期

上图横坐标仍是数字,需要转化成日期格式,但又不能直接使用日期(存在同一个日期对应多根线条的情况),所以思路是用数字横坐标打底后,再用日期值覆盖数字值横坐标。

def gujiatu(data):fig,ax = plt.subplots()tx = 0#提取日期列表,这里用到了datetime包,datetime有现成的.date()使其不包含时间后缀#PS尝试过用DT = pd.to_datetime(data.date,format=\%Y/%m/%d),但用于横坐标时会带有00:00:00后缀导致太长,暂不清楚怎么去掉_(:зゝ∠)_谁知道麻烦告诉我,谢谢!我喜欢能用一个包解决的事绝不用两个DT =

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。