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

滚爬出一种简单能用的办法,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
  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值