滚爬出一种简单能用的办法,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 =