matplotlib使用矩形补丁绘制K线图时x轴xtick日期显示异常如何解决
问题原因
- 你当前x轴使用的是自定义整数
Days_num(距离起始日的天数),不属于matplotlib日期模块可识别的日期格式,因此mdates.AutoDateLocator()配置完全不生效。 set_xticklabels被错误放在for循环内部,会被重复执行覆盖配置;且你没有提前指定x轴刻度的位置,直接设置标签会出现位置不匹配问题,最终只能显示前几个日期。- 原代码函数定义后缺少必要缩进,会直接触发语法报错。
修正后可运行代码
import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import yfinance as yf import numpy as np 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) # 配置x轴刻度,步长20可按需调整 tick_step = 20 ax.set_xticks(df.Days_num[::tick_step]) ax.set_xticklabels([x.strftime('%d-%m-%y') for x in df.index[::tick_step]]) ax.grid(True) fig.tight_layout() fig.autofmt_xdate() plt.show() candlestick(df)
调整说明
- 修正了函数内部代码的缩进问题
- 删除了不生效的
mdates.AutoDateLocator()配置 - 将x轴刻度配置移到for循环外部,先匹配刻度位置再设置对应日期标签
- 可通过修改
tick_step参数调整x轴标签的显示密度,数值越小显示的日期越多
内容的提问来源于stack exchange,提问作者Rockoos
相关产品推荐
相关产品推荐

