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

Matplotlib使用axhline绘制水平线时xmin位置不符合预期如何修复

问题原因

原有代码的核心错误是axhline方法的xmin参数计算逻辑错误:直接用循环序号除以低点总数量得到的比例,和实际时间轴的坐标比例完全不匹配,因此水平线的起始位置和黑色标记的低点错位。

修复思路

axhline的xmin/xmax参数是取值范围为0~1的归一化坐标,对应x轴从最左侧到最右侧的位置,我们需要把每个低点的实际交易日期换算为对应的归一化比例,作为xmin的传入值。

修改后的完整代码

import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf  # pip install yfinance

# 下载数据
df = yf.download('reliance.ns', '2019-01-01', '2021-01-01')
df.rename(columns= {'Adj Close': 'Adj_close'}, inplace= True)

def low_in(n=30):
    n = n * -1
    all_lows = []
    for x in range(1, len(df.index) + 1):
        slice = df.Adj_close[n * x: n*x - n]
        if len(slice) == -n:
            low = min(slice.tolist())
            all_lows.append(low)
        else:
            pass
    return all_lows   


x = low_in()
df1 = df[df.Adj_close.isin(x)]
df1 = df1[['Adj_close']]

fig, ax1 = plt.subplots(figsize=(15, 6))
ax1.plot(df.index, df.Adj_close)
ax1.scatter(df1.index, df1.Adj_close, s=30, c='k')
# --------------修改部分开始--------------
# 计算x轴总时间跨度
total_days = (df.index[-1] - df.index[0]).days
# 遍历每个低点的日期和价格
for low_date, low_price in df1['Adj_close'].items():
    # 计算当前低点日期对应的归一化x坐标作为xmin
    xmin = (low_date - df.index[0]).days / total_days
    ax1.axhline(y=low_price, xmin=xmin, c='m')
# --------------修改部分结束--------------
ax1.grid(True)

ax1.set_xlim(df.index[0], df.index[-1])
fig.autofmt_xdate()
fig.tight_layout()
plt.show()

运行修改后的代码,水平线就会从对应低点的位置开始向右绘制,符合预期效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 22:18:01