滚爬出一种简单能用的办法,matplotlib文档真是简要得让人头秃……
场景
根据原始数据.csv画一段股价走势图,要求以日期作为横坐标,原始数据内包含日期、时间、最高价、最低价,大致如下图所示。
一、读取和整理数据
用Pandas读取csv,截取出需要作图的行区域。
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
#打开数据
f = open('原始数据.csv')
data = pd.read_csv(f)
#列重命名
new_col = ['date','time','H','L']
data.columns = new_col
#选择需要作图的行数,stt和edd分别是开始行和结束行,用切片方式选择
stt,edd = 938,1000
data = data.iloc[stt:edd+1]
#将行索引还原成默认值,即从0开始步长为1的数组,原来的索引直接删除
data = data.reset_index(drop=True)
二、作图
1.画出基础图形
定义一个作图用的函数,方便后续调用。
def gujiatu(data):
fig,ax = plt.subplots()
tx = 0
for indexs in data.index:
v = data.loc[indexs].values
H,L = v[2],v[3]
ax.vlines(tx+1,H,L,color='#000000')
tx += 1
plt.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 = [datetime.strptime