如何使用 mplfinance.plot() 或任何类似的包在每根蜡烛上方添加字符串注释?

How to add a string comment above every single candle using mplfinance.plot() or any similar package?

我想使用 mplfinance 包在每根蜡烛上方添加一个字符串评论。

有没有办法使用 mplfinance 或任何其他软件包来做到这一点?

这是我使用的代码:

import pandas as pd
import mplfinance as mpf
import matplotlib.animation as animation
from mplfinance import *
import datetime
from datetime import date, datetime

fig = mpf.figure(style="charles",figsize=(7,8))
ax1 = fig.add_subplot(1,1,1 , title='ETH')

def animate(ival):
    idf = pd.read_csv("test1.csv", index_col=0)
    idf['minute'] = pd.to_datetime(idf['minute'], format="%m/%d/%Y %H:%M")

    idf.set_index('minute', inplace=True)

    ax1.clear()
    mpf.plot(idf, ax=ax1, type='candle',  ylabel='Price US$')

ani = animation.FuncAnimation(fig, animate, interval=250)

mpf.show()

您应该可以使用 Axes.text()

来做到这一点

调用mpf.plot()之后调用

ax1.text()

对于您想要的每个文本(在您的情况下为每根蜡烛)。

关于您传递给 ax1.text()x 轴值,有一个 重要警告:

  • 如果你指定show_nontrading=True那么它将默认为False在这种情况下x轴值[=您传递到 ax1.text() 的文本 的 82=] 必须是与您希望文本 0 开始计数的蜡烛对应的行号 用于 DataFrame 中的第一行。
  • 另一方面,如果您 do 设置 show_nontrading=True 那么您传递给 ax1.text() 的 x 轴值将需要是 matplotlib 日期时间。您可以将 DataFrame DatetimeIndex pandas datetimes 转换为 matplotlib datetimes,如下所示:
import matplotlib.dates as mdates
my_mpldates = mdates.date2num(idf.index.to_pydatetime())

我建议使用第一个选项(DataFrame 行号),因为它更简单。我目前正在研究 mplfinance 增强功能,它允许您将 x 轴值作为任何类型的日期时间对象输入(这是更直观的方法),但是可能还需要一两个月才能完成该增强功能,因为它不是微不足道的。


代码示例,使用来自 mplfinance repository examples data folder:

的数据
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).

  • 请注意,对于带有文本的前两个蜡烛,文本从蜡烛的中心开始。第 3 个文本调用使用 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
    
  • 这是上面代码生成的图: