如何使用 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
这是上面代码生成的图:
我想使用 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
这是上面代码生成的图: