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

如何在matplotlib.pyplot中移除K线图X轴的空白时间区间?

解决Matplotlib绘制1分钟黄金K线图时时间轴空白的问题

核心思路很简单:Matplotlib默认会把时间轴按连续时间渲染,无交易的空白时段自然会留空。我们可以把x轴换成数据行的索引,再把索引对应的时间标签替换上去,这样只显示有K线数据的时间点,空白就自动消失了。下面给两种可行的实现方式:

方式一:手动用Matplotlib绘制K线(完全自定义)

假设你的数据是包含datetime、open、high、low、close的DataFrame,代码如下:

import matplotlib.pyplot as plt
import pandas as pd

# 读入数据(示例,替换成你的数据路径)
df = pd.read_csv('xauusd_1min_data.csv', parse_dates=['datetime'])
# 如果datetime是索引,先重置为列方便处理
# df = df.reset_index()

# 创建连续的x轴索引(每个K线对应一个索引,无空白)
x = range(len(df))

# 初始化画布
fig, ax = plt.subplots(figsize=(12, 6))

# 绘制K线影线:连接最高价和最低价
ax.vlines(x, df['low'], df['high'], color='black', linewidth=1)

# 区分涨跌,绘制K线实体
up = df[df['close'] >= df['open']]
down = df[df['close'] < df['open']]
# 上涨K线(红实体,底部是开盘价)
ax.bar(x[up.index], up['close'] - up['open'], bottom=up['open'], color='#ff4500', width=0.8)
# 下跌K线(绿实体,底部是收盘价)
ax.bar(x[down.index], down['open'] - down['close'], bottom=down['close'], color='#32cd32', width=0.8)

# 设置x轴刻度:只显示有数据的时间点,避免标签重叠
# 每隔60根K线显示一个标签,可根据图表宽度调整间隔
ax.set_xticks(x[::60])
# 把刻度替换成对应的时间字符串
ax.set_xticklabels(df['datetime'].dt.strftime('%Y-%m-%d %H:%M')[::60], rotation=45)

# 添加基础标签和标题
ax.set_xlabel('时间')
ax.set_ylabel('价格')
ax.set_title('XAUUSD 1分钟K线图')

# 自动调整布局,防止标签被截断
plt.tight_layout()
plt.show()

关键细节:

  • 用range(len(df))生成连续索引作为x轴,彻底避免时间轴的空白
  • 通过set_xticks和set_xticklabels把索引映射回时间标签,只显示有数据的时段
  • 调整[::60]的数值可以控制标签密度,防止重叠

方式二:用mplfinance(基于Matplotlib的K线专用库)

如果你不想手动写K线绘制逻辑,mplfinance是更高效的选择,它完全基于Matplotlib,且自带移除无交易时段空白的参数:

import mplfinance as mpf
import pandas as pd

# 读入数据,注意要把datetime设为索引
df = pd.read_csv('xauusd_1min_data.csv', parse_dates=['datetime'], index_col='datetime')

# 绘制K线,核心参数是show_nontrading=False,直接移除无交易时段的空白
mpf.plot(
    df,
    type='candle',  # 绘制K线
    mav=(5, 10),    # 可选:添加5、10周期均线
    volume=False,   # 可选:是否显示成交量
    show_nontrading=False,  # 关键:隐藏无交易的空白时段
    figsize=(12, 6),
    title='XAUUSD 1分钟K线图'
)
plt.show()

这个方案更简洁,show_nontrading=False会自动识别并隐藏无交易的时段,时间轴只保留有K线数据的区间,完美解决空白问题。

注意事项

  • 如果数据中有重复的时间戳,先执行df = df.drop_duplicates(subset='datetime')去重,避免索引错误
  • 调整标签间隔时,要根据数据量和图表宽度灵活设置,确保标签清晰可读

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:53:11