您应该可以使用Axes.text()
打完电话mpf.plot()
再打
ax1.text()
对于您想要的每个文本(在您的情况下为每个蜡烛)。
关于传入的x 轴值有一个重要的警告:ax1.text()
- 如果您没有指定
show_nontrading=True
,那么它将默认为False
在这种情况下,您为文本位置传递的x 轴值必须是与蜡烛相对应的行号,您希望文本从0开始计数的第一行你的数据框。ax1.text()
- 另一方面,如果您确实设置
show_nontrading=True
了,那么您传入的 x 轴值ax1.text()
将需要是matplotlib datetime。您可以将DataFrame DatetimeIndex 中的pandas 日期时间转换为 matplotlib 日期时间,如下所示:
import matplotlib.dates as mdates
my_mpldates = mdates.date2num(idf.index.to_pydatetime())
我建议使用第一个选项(DataFrame 行号),因为它更简单。我目前正在研究一种 mplfinance 增强功能,它允许您将 x 轴值作为任何类型的日期时间对象输入(这是更直观的方法),但是可能需要一两个月才能完成增强,因为它不是微不足道的。
代码示例,使用mplfinance 存储库示例数据文件夹中的数据:
import pandas as pd
import mplfinance as mpf
infile = 'data/yahoofinance-SPY-20200901-20210113.csv'
# take rows [18:28] to keep the demo small:
df = pd.read_csv(infile, index_col=0, parse_dates=True).iloc[18:25]
fig, axlist = mpf.plot(df,type='candle',volume=True,
ylim=(330,345),returnfig=True)
x = 1
y = df.loc[df.index[x],'High']+1
axlist[0].text(x,y,'Custom\nText\nHere')
x = 3
y = df.loc[df.index[x],'High']+1
axlist[0].text(x,y,'High here\n= '+str(y-1),fontstyle='italic')
x = 5
y = df.loc[df.index[x],'High']+1
axlist[0].text(x-0.2,y,'More\nCustom\nText\nHere',fontweight='bold')
mpf.show()
对上述代码示例的注释:
我正在设置ylim=(330,345)
,以便在蜡烛上方为文本提供一点额外的空间。在实践中,您可能会动态选择高点high_ylim = 1.03*max(df['High'].values)
。
请注意,对于带有文本的前两个蜡烛,文本从蜡烛的中心开始。第三个文本调用用于x-0.2
将文本更多地定位在蜡烛的中心。
对于此示例,蜡烛的y
位置是通过获取该蜡烛的高点并添加 来确定的1
。( y = df.loc[df.index[x],'High']+1
) 当然,添加1
是任意的,实际上,根据您的价格大小,添加 1 可能太少或太多。相反,您可能想要添加一个小百分比,例如 0.2%:
y = df.loc[df.index[x],'High']
y = y * 1.002
这是上面代码生成的图: