其他教程里的k线图都是使用的tushare等现成的库获取数据后直接使用 matplotlib.finance.candlestick_ochl绘制图形,但是对于使用自己的数据的情况并没有详细的说明.
下面从我的代码中摘要部分重点,第一部是包的导入,如果matplotlib.pyplot .show()不能显示图形的话,要在导入 matplotlib.pyplot 之前,导入matplotlib之后执行 matplotlib.use('TkAgg') ,TkAgg是使用tkinter的图形界面
import datetime
from tkinter import *
import pandas as pd
import numpy as np
import matplotlib
matplotlib.use('TkAgg') # 处理图形不显示的问题,要在导入 matplotlib.pyplot 之前
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.finance as mpf
下面的函数是把datetime类型的数据转换为绘制图形所需的类型.
datetime2matplotlib_np_array(data_datetime) # data_datetime是numpy.array类型,
datetime2matplotlib(data_datetime) # data_datetime是list类型
def datetime2matplotlib(data_list):
"""
把 data_list 中的 datetime 类型的数据转换为 matplotlib 的轴所需的格式
:param data_list: list,只有一个 datetime 类型元素
:return: list
"""
for index, i in enumerate(data_list):
data_list[index] = mpf.date2num(datetime.datetime.strptime(i, "%Y-%m-%d %H:%M:%S"))
return data_list
def datetime2matplotlib_np_array(np_array):
"""
把 numpy 中的datetime 类型的数据转换为 matplotlib 的轴能使用的类型
:param np_array: numpy.array,只有一个 datetime 类型元素
:return:
"""
for line_no, line in enumerate(np_array):
# 把日期整理成所需的类型
datetime_field = line[0]
datetime_field = datetime.datetime.strptime(datetime_field, "%Y-%m-%d %H:%M:%S")
np_array[line_no][0] = mpf.date2num(datetime_field)
return np_array
使用candlestick_ochl把kline_data绘制出来.
如果要在k线上附近均线等和价格对应的数据,要使用ax_kline.twiny() 共享y轴,这样只有均线和k线的运距条数一样,y轴就能正常共享坐标了,实现了正常的k线图表.
# 绘制k线
mpf.candlestick_ochl(ax_kline, kline_data, width=0.6, colorup='red', colordown='green', alpha=1.0)
# ax_kline.xaxis.set_major_locator(mdates.DayLocator(bymonthday=range(1, 32), interval=15)) # 设置x轴间隔
ax_kline.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d")) # 格式化X轴的时间
for label in ax_kline.xaxis.get_ticklabels():
label.set_rotation(45) # 旋转x轴
# k线上附加绘制均线
ax_ma5 = ax_kline.twiny() # 共享y轴
ax_ma5.plot(data_datetime, data_ma5, linewidth=1, linestyle="-", color="blue")
ax_ma10 = ax_kline.twiny() # 共享y轴
ax_ma10.plot(data_datetime, data_ma10, linewidth=1, linestyle="-", color="#00ff00")
plt.grid(True) # 显示网格
plt.show()