欢迎来到RankFan的Blogs

扩大
缩小

Python可视化--HA Candle作图

Overview

最近遇到一个问题,做蜡烛图,怎么把x轴变为时间轴,candlestick_ohlc中的date数据需要时整数型,当选择其他类型数据时,会报错!

具体文章请参考:如何用Python计算 HA candles

上网找了一下,第一个方法思路是:

  • 先把时间转化为数字
  • 用数字绘图
  • 绘制完图后把xtick改为时间类型,

这里有个小问题,如果休市,会出现一段空白,不是很美观。

当我们使用DateFrame数据格式时,可以使用pandas.core.indexes.datetimes.DatetimeIndex类型的数据格式,一般是df.index,所以我们要解决的问题就是如何使用df.index绘图,我们在第二种方法中会使用df.index

第一种方法

# 导入库
import pandas as pd
from pandas import DataFrame
import yfinance
from mpl_finance import candlestick_ohlc
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker # ticker 标签
from matplotlib.ticker import Formatter
import matplotlib.dates as dates
import numpy as np
import datetime # Python3 中引入的日时间
import time

# 绘制画布,
plt.rcParams['figure.figsize'] = [12, 7]
plt.rc('font', size=12)
# 获取数据源
name = 'SPY'
ticker = yfinance.Ticker(name)
df = ticker.history(interval="1d", start="2020-12-15", end="2021-04-15")
## 数据结构重排
df['Date'] = range(df.shape[0])
df = df.loc[:, ['Date', 'Open', 'High', 'Low', 'Close']] # 重排 df 数据结构
### date to num
df['Date']=pd.to_datetime(df.index,format="%Y/%m/%d")
df['Date'] = df['Date'].apply(lambda x:dates.date2num(x))
### 定义num转化为str的类
class My_format(Formatter):
    def __init__(self, dates, fmt = '%y/%m/%d' ):
        self.dates = dates
        self.fmt = fmt

    def __call__(self, x, pos=0):
        'return the label for time x at position pos'
        ind = int(np.round(x)) # ind是x的刻度数值,不是日期的下标

        return dates.num2date(ind).strftime(self.fmt)
### 定义绘图函数
def plot_charts(df, formatter):
    fig, ax = plt.subplots()
    fig.subplots_adjust(bottom = 0.1)
    candlestick_ohlc(ax, df.values, width=0.6,
                     colorup='green', colordown='red', alpha=0.8)
    ax.xaxis.set_major_formatter(formatter) # 将num 改为 str时间格式
    ### 调整坐标轴标签位置
    for label in ax.get_xticklabels():
        label.set_rotation(60) # 旋转60度
        label.set_horizontalalignment('right') # 正对标签下方
    fig.tight_layout()
    fig.show()
### 运行实例
formatter = My_format(df["Date"][:])
plot_charts(df, formatter)

另一种方法

import yfinance
from mpl_finance import candlestick_ohlc
import matplotlib.pyplot as plt
import pandas as pd
# 绘制画布,
plt.rcParams['figure.figsize'] = [12, 7]
plt.rc('font', size=12)
# 获取数据源
name = 'SPY'
ticker = yfinance.Ticker(name)
df = ticker.history(interval="1d", start="2020-12-15", end="2021-04-15")
## 数据结构重排
df['Date'] = range(df.shape[0])
df = df.loc[:, ['Date', 'Open', 'High', 'Low', 'Close']] # 重排 df 数据结构
## 绘图
fig, ax = plt.subplots()
fig.subplots_adjust(bottom = 0.1)
candlestick_ohlc(ax, df.values, width=0.6,
                 colorup='green', colordown='red', alpha=0.8)
## x轴标签设置
ax.set_xlabel('Time') # x轴标签
ax.set_ylabel('Index') # y轴标签
ax.set_xlim(0, len(df.index)) #x轴范围
ax.set_xticks(range(-1, len(df.index), 15))  # 间隔设置为15
ax.set_xticklabels([df.index.strftime('%Y-%m-%d')[index] for index in ax.get_xticks()]) # 转化为时间标签
### 调整坐标轴标签位置
    for label in ax.get_xticklabels():
        label.set_rotation(60) # 旋转60度
        label.set_fontsize(10) #字体大小设置为10
        label.set_horizontalalignment('right') # 正对标签下方

posted on 2021-04-26 16:50  RankFan  阅读(202)  评论(0编辑  收藏  举报

导航