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
相关产品推荐
相关产品推荐

