我有一个图表,它显示了一只股票在一天中每隔五分钟的收盘价。X轴显示时间,x值的范围是从9:30到4:00 (16:00)。问题是x轴的自动边界是从9:37到16:07,而我真的只想要它从9:30到16:00。
我当前运行的代码是:
stk = yf.Ticker(ticker)
his = stk.history(interval="5m", start=start, end=end).values.tolist() #open - high - low - close - volume
x = []
y = []
count = 0
five_minutes = datetime.timedelta(minutes = 5)
for bar in his:
x.append((start + five_minutes * count))#.strftime("%H:%M"))
count = count + 1
y.append(bar[3])
plt.clf()
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))
plt.gca().xaxis.set_major_locator(mdates.MinuteLocator(interval=30))
plt.plot(x, y)
plt.gcf().autofmt_xdate()
plt.show()
它会生成这个图(当前是一个链接,因为我使用的是一个新用户帐户):
我认为应该使用datetime函数axis.set_data_interval,所以我通过提供代表9:30和16:00的datetime对象来实现。这给了我一个错误:
TypeError:'float‘和'datetime.datetime’的实例之间不支持'<‘
有没有其他方法可以让我在调整第一个xtick的同时,让它自动填充剩下的部分?
发布于 2021-02-13 16:20:02
通过调整mdates
记号定位器的使用方式,可以修复此问题。这是一个基于r-beginners共享的示例,以使其具有可比性。请注意,我使用pandas plotting function是为了方便起见。它需要x_compat=True
参数才能与mdates
一起使用
import pandas as pd # 1.1.3
import yfinance as yf # 0.1.54
import matplotlib.dates as mdates # 3.3.2
# Import data
ticker = 'AAPL'
stk = yf.Ticker(ticker)
his = stk.history(period='1D', interval='5m')
# Create pandas plot with appropriately formatted x-axis ticks
ax = his.plot(y='Close', x_compat=True, figsize=(10,5))
ax.xaxis.set_major_locator(mdates.MinuteLocator(byminute=[0, 30]))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M', tz=his.index.tz))
ax.legend(frameon=False)
ax.figure.autofmt_xdate(rotation=0, ha='center')
发布于 2021-02-13 09:17:37
样本数据是通过从雅虎财经获取苹果的股票价格而创建的。所需的五分钟间隔标签是通过使用date函数以五分钟间隔获取开始和结束时间而获得的字符串列表。在此基础上,将x轴绘制为五分钟间隔数和收盘价的图表,并通过切片将x轴设置为任意间隔。
import yfinance as yf
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
import numpy as np
ticker = 'AAPL'
stk = yf.Ticker(ticker)
his = stk.history(period='1D',interval="5m")
his.reset_index(inplace=True)
time_rng = pd.date_range('09:30','15:55', freq='5min')
labels = ['{:02}:{:02}'.format(t.hour,t.minute) for t in time_rng]
fig, ax = plt.subplots()
x = np.arange(len(his))
y = his.Close
ax.plot(x,y)
ax.set_xticks(x[::3])
ax.set_xticklabels(labels[::3], rotation=45)
plt.show()
https://stackoverflow.com/questions/66182758
复制