首页 > 解决方案 > 无法在 matplotlib 的 xtick 标签中正确获取日期

问题描述

嗨,我正在尝试使用 matplotlib 中的矩形补丁制作烛台,但 xaxis 上的日期不正确。我必须使用一个数字作为 x 值来创建矩形形状,现在我想用数据框索引中的相应日期替换这些值。这是代码:`

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.dates as mdates
import yfinance as yf
import numpy as np
import datetime as dt

df = yf.download('adaniports.ns', '2015-01-01', '2016-01-01')
df.rename(columns={'Adj Close': 'Adj_close'}, inplace= True)

def candlestick(df, colorup= '#2bff1c', colordown= '#ff5e00'):
df.reset_index(inplace= True)
df['Days_num'] = df.Date.apply(lambda x: x - df.Date[0])
df.set_index('Date', inplace= True)
df.Days_num = df.Days_num.apply(lambda x: x/np.timedelta64(1, 'D')).astype(int)

fig, ax = plt.subplots(figsize= (12, 8))
ax.plot([df.Days_num, df.Days_num], [df.High, df.Low], color= 'k', solid_capstyle='round', linewidth= 0.8)
for x in range(len(df.index)):
    if df.Close[x] > df.Open[x]:
        color = colorup
    else:
        color = colordown
    rec = mpl.patches.Rectangle((df.Days_num[x] - 0.25, df.Open[x]), 0.5, (df.Close[x] - df.Open[x]), facecolor= color,\
                               edgecolor= 'k', linewidth= 0.5, capstyle= 'round', zorder= 3)
    ax.add_patch(rec)
    ax.set_xticklabels([x.strftime('%d-%m-%y') for x in df.index.tolist()])
    ax.xaxis.set_major_locator(mdates.AutoDateLocator())
ax.grid(True)
fig.tight_layout()
fig.autofmt_xdate()
plt.show()

candlestick(df)

这是输出: 在此处输入图像描述 如您所见,范围是一年,但 x-ticks 仅绘制 1 个月。

我知道有像 mplfinance 这样的库,但我宁愿这样做,因为我需要对其进行自定义,这在这些库中是困难的。

标签: pythonmatplotlib

解决方案


推荐阅读