3

我希望它是这样的图片

我想使用 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()
4

1 回答 1

1

您应该可以使用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
    
  • 这是上面代码生成的图:

在此处输入图像描述

于 2021-12-14T01:08:14.453 回答