You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matplotlib的datetime轴上绘制矩形以手动创建K线图?

解决Matplotlib绘制K线图时datetime64[ns]轴的报错问题

我之前也踩过Matplotlib手动画K线图时datetime轴的坑!核心问题是Matplotlib对numpy的datetime64[ns]类型的坐标支持不直接,直接用它定位Rectangle这类图形元素会因为类型不兼容报错,必须先把日期转换成Matplotlib能识别的数值格式才行。

下面是调整后的可运行代码,我标注了关键修改点:

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import numpy as np
import pandas as pd

# 模拟股票数据(替换成你的真实数据即可)
dates = pd.date_range('2024-01-01', periods=10)
data = pd.DataFrame({
    'Open': np.random.uniform(100, 120, 10),
    'High': np.random.uniform(120, 130, 10),
    'Low': np.random.uniform(90, 100, 10),
    'Close': np.random.uniform(100, 120, 10)
}, index=dates)

# 关键步骤:把datetime64[ns]转换成Matplotlib内部的日期数值
x = plt.date2num(data.index.to_pydatetime())
width = 0.3  # K线实体的宽度

fig, ax = plt.subplots(figsize=(10, 6))

# 绘制高低价的竖线(errorbar)
ax.errorbar(x, (data['High'] + data['Low']) / 2, 
            yerr=[data['High'] - (data['High'] + data['Low']) / 2, 
                  (data['High'] + data['Low']) / 2 - data['Low']],
            fmt='none', c='black', capsize=0)

# 绘制K线实体(Rectangle)
for i in range(len(data)):
    open_price = data['Open'].iloc[i]
    close_price = data['Close'].iloc[i]
    # 根据涨跌设置实体颜色
    color = 'green' if close_price >= open_price else 'red'
    # 用转换后的x数值定位矩形,高度为开盘收盘的差值
    rect = Rectangle((x[i] - width/2, min(open_price, close_price)), 
                     width, abs(close_price - open_price), 
                     facecolor=color, edgecolor='black')
    ax.add_patch(rect)

# 格式化x轴为可读的日期格式
ax.xaxis.set_major_formatter(plt.matplotlib.dates.DateFormatter('%Y-%m-%d'))
fig.autofmt_xdate()  # 自动旋转日期标签,避免重叠

ax.set_xlabel('Date')
ax.set_ylabel('Price')
ax.set_title('Manual Candlestick Chart')
plt.grid(alpha=0.3)
plt.show()

核心修改说明:

  • 日期类型转换:用plt.date2num()把datetime64[ns]转换成Matplotlib内部使用的浮点数格式,彻底解决坐标类型不兼容的报错。
  • Errorbar参数优化:直接计算高低价到中间价的差值,确保竖线精准覆盖当日高低点范围。
  • 日期轴美化:添加DateFormatter和autofmt_xdate()让x轴日期显示更清晰,避免标签重叠。

如果你的原始代码还有其他细节问题(比如数据索引处理不当),可以对照上面的代码调整——记住核心原则:不要直接用numpy datetime64类型作为图形元素的坐标值,必须先做格式转换。

内容的提问来源于stack exchange,提问作者Coolio2654

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:13:57