简述:
- 图形简单,图形绘制未排除法定节假日的休市日期,导致图形中K线图不连续 会有空缺
- matplotlib模块目前还未详细看
- numpy的文件导入和pandas的文件导入对比需要留意,厘清各参数的意义
读取CSV文件:
loadtext (文件名,分隔符(delimiter),usecols=(列索引表—需要的列), unpack=True, dtype=元素类型, converters={列索引号:转换函数})
注:unpack=True 表示所有的分隔符都进行处理
note: numpy和pandas导入文件区别,pandas函数名为pd.read_csv()/ pd.read_table/ pd.ExcelFile, xls_file.parse(‘sheet1’)…
import os
import sys
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as md
import platform # pltform模块
import datetime as dt
# 解析日期函数
def dmy2ymd(dmy):
# return dt.datetime.strptime(dmy, '%d-%m-%Y').date().strftime('%Y-%m-%d')
# TypeError: strptime() argument 1 must be str, not bytes
# return dt.datetime.strptime(str(dmy), '%d-%m-%Y').date().strftime('%Y-%m-%d')
# ValueError: time data "b'28-01-2011'" does not match format '%d-%m-%Y'
return dt.datetime.strptime(
str(dmy, encoding = 'utf-8'), '%d-%m-%Y').date().strftime('%Y-%m-%d')
# str(dmy, encoding = 'utf-8'): 构造str对象的同时可以指定字符编码
# 将中文window默认dbcs(双字节字符集)字符编码的gb2312字符串转化为unicode字符串(utf-8)
# 定义读取文件的函数
def read_data(filename):
dates, open_price, high_price, low_price, close_price = np.loadtxt(
filename, delimiter = ',', usecols = (1,3,4,5,6), unpack = True,
dtype = np.dtype('M8[D],f8,f8,f8,f8'),
converters = {1:dmy2ymd})
return dates, open_price, high_price, low_price, close_price
# M8[D] D表示日期精度以天为单位
'''
print(dates)
print(open_price)
print(high_price)
print(low_price)
print(close_price)
'''
# chart初始化设置函数
def init_chart(first_day, last_day):
# gcf(): get current figur
# set_facecolor() 设置背景色; np.ones(3)*(240/250) 灰度值 rgb三个值
plt.gcf().set_facecolor(np.ones(3)*(240/250))
# 设置标题
plt.title('Candlestick Chart', fontsize=20)
# 设置轴标签
plt.xlabel('Trading Days From %s to %s' %(
first_day.astype(md.datetime.datetime).strftime(
'%d %m %Y'),
last_day.astype(md.datetime.datetime).strftime(
'%d %m %Y')),fontsize=14)
plt.ylabel('Stock Price(USD) of Apple Inc.', fontsize=14)
# 获取当前轴并设置轴
ax = plt.gca()
# 设置轴刻度:
# 定位器:set_major_locator 主定位器; set_minor_locator 次定位器
ax.xaxis.set_major_locator(md.WeekdayLocator(byweekday=md.MO))
ax.xaxis.set_minor_locator(md.DayLocator())
# 格式器:set_major_formatter 主格式器
ax.xaxis.set_major_formatter(md.DateFormatter('%d/%m/%Y'))
# 设置刻度
plt.tick_params(which='both', top=True, right=True, labelright=True, labelsize=10)
# which:[x,y,(x,y)--both], top/right=True 顶部显示刻度(默认left/down显示)
# labelright=True 右边显示刻度值(即刻度标签)
# 设置网格: 线型 ':'表示点线; '--' 虚线; '-' 实线
plt.grid(linestyle=':')
# 定义画图函数
def draw_chart(dates, open_price, high_price, low_price, close_price):
# dates类型更改:从numpy中的时间类型转化为md模块中的时间类型
dates = dates.astype(md.datetime.datetime)
# 上下影线
# 浮点数有误差,不直接使用差值(对比价差阈值),转化为bool
up = close_price - open_price >= 1e-2
down = open_price - close_price >= 1e-2
# 图形颜色确定,上涨为红,下跌为绿,持平黑色
full_color = np.zeros(dates.size,dtype='3f4') # '3f4'表示3个浮点数f4
edge_color = np.zeros(dates.size,dtype='3f4')
# 形状填充色
full_color[up], full_color[down] = (1,1,1),(0,0.5,0) # RGB灰度? 1表示最亮(1,1,1)==白色
# 形状边缘轮廓色
edge_color[up], edge_color[down] = (1,0,0),(0,0.5,0) # (1,0,0) 红色
# 绘制影线, 宽度==0即可
plt.bar(dates, high_price - low_price, 0, low_price,
align='center',color=full_color, edgecolor=edge_color)
# 绘制实体:参数为坐标(横坐标时间,纵坐标高度即价差,bar宽度,底坐标,对其方式,实体颜色,轮廓颜色)
plt.bar(dates, close_price - open_price, 0.8, open_price,
align='center',color=full_color, edgecolor=edge_color)
# 自动调整x轴日期倾斜角度 plt.gcf属性
plt.gcf().autofmt_xdate()
# 定义图像显示函数
def show_chart():
# 获取当前状态管理器
mng = plt.get_current_fig_manager()
# 设置窗口大小(window系统中state参数为zoomed表示窗口最大化)
# 判断操作系统是否属于window , platform模块
if 'windows' in platform.system():
mng.window.state('zoomed')
else:
# 非windows系统通过resize设置窗口宽和高
mng.resize(*mng.window.maxsize()) # resize需要width,height两个参数,maxsize返回一个元组
# maxsize()返回的是一个元组,前面加'*'表示将元组展开作为2个值传给resize
# 可迭代元素(列表, 元组, 生成器等)作为参数, 可以使用*展开参数
plt.show()
# 定义主函数
def main(argc, argv, envp):
# 导入文件
dates, open_price, high_price, low_price, close_price = read_data('aapl.csv')
# 图形初始化
init_chart(dates[0], dates[-1])
# 画图
draw_chart(dates, open_price, high_price, low_price, close_price)
# 显示图形
show_chart()
return 0
# 调用主函数
if __name__ == '__main__':
sys.exit(main(len(sys.argv),sys.argv,os.environ))