使用 mplfinance 库的外部轴方法绘制多个蜡烛图时,如何在蜡烛图内绘制成交量?

3
我正在进行的项目需要使用mplfinance库编写代码,在几个图表中绘制300多个蜡烛图。我知道这只能使用外部轴方法来完成,因为它提供了更大的灵活性,并且理论上可以绘制无限数量的图表。
我目前使用的代码如下,绘制的图表如下所示:
import mplfinance as mpf

s = mpf.make_mpf_style(base_mpf_style='yahoo', rc={'font.size': 6})
fig = mpf.figure(figsize=(34, 13.2), style=s, tight_layout=True)

ax_p = fig.add_subplot(n_rows, n_cols, pos_price)
ax_v = fig.add_subplot(n_rows, n_cols, pos_vol, sharex=ax_p)

fig, ax_list = mpf.plot(resampled_df, type='candle', ax=ax_p, volume=ax_v, show_nontrading=False,
                     datetime_format='%a %d-%m-%y', xrotation=0, returnfig=True)

这是我的代码绘制的数百个图表中的6个示例图的截图:

enter image description here

上述代码绘制的两个图表的截图如下: enter image description here 如您所见,成交量图表被绘制在蜡烛图表格下方。我很难找到将成交量移动到蜡烛图表格中的解决方法。mplfinance文档中有一个类似的帖子issue 114,解释了如何做到这一点......但是对于像我这样刚接触该库的新手来说,我发现它相当难以理解。
如果您能发布详细的代码来完成此操作,我将不胜感激!
2021年2月12日更新:
根据@Daniel的建议,我修改了代码,使用add_axes()而不是add_subplot(),现在在绘制多个图表时,成交量位于蜡烛图表格底部。非常好!答案已被接受。

enter image description here

ax_intra_day_candle = fig.add_axes([x_pos, y_pos, ax_width, ax_height])
ax_intra_day_candle.set_title(title)
ax_intra_day_volume = fig.add_axes([x_pos, y_pos - ax_vol_height, ax_width, ax_vol_height], sharex=ax_intra_day_candle)
mpf.plot(intra_day_df, type='candle', ax=ax_intra_day_candle, volume=ax_intra_day_volume, show_nontrading=False,
                 datetime_format='%a %m-%d', xrotation=0)

顺便提一下,当你使用“外部轴模式”时,returnfig=True将被忽略(因为mplfinance没有返回图形对象的功能,而且无论如何调用者都拥有Figure和Axes对象)。 - undefined
谢谢Daniel。是的,那很有道理。我修改了代码,现在它像问题中的更新一样完美运行。还有很多关于mplfinance需要学习的地方。感谢你对这个库的贡献! - undefined
Rosie,谢谢你告诉我。很高兴它对你有用。如果你有机会,请在某个地方发布你的结果。我真的很喜欢看到人们用mplfinance做出的创意作品。祝一切顺利。 - undefined
2个回答

5
我假设您的问题是希望将音量和蜡烛图共享同一x轴,类似于这里显示的图片。
最简单的方法是使用fig.add_axes()(而不是fig.add_subplot())。
通过这种方式,您可以精确地控制每个Axes对象在Figure中的位置。您可以在mplfinance代码中看到这样做
基本思路是您按总图的比例指定每个Axes对象的位置,指定其左下角和其宽度和高度。
当您想要让两个Axes对象紧密接触且没有空白时,您需要相应地指定位置和宽度/高度,以便下部Axes的顶部和上部Axes的底部完全相遇。
例如,要将两个大小相等的Axes对象完全堆叠在彼此上方,比方说在Figure的左上象限,您可以这样做:
# ax = fig.add_axes([left,bottom,width,height])

ax1 = fig.add_axes([0.05,0.75,0.5,0.25])
ax2 = fig.add_axes([0.05,0.50,0.5,0.25])
  • 左侧的0.05空间为y轴标签留出了空间。
  • ax1从底部开始的四分之三(0.75),向右伸展了一半(0.5)高度为0.25(将其带到图形的最顶端)。
  • ax2从底部开始的一半(0.50)开始,向右也伸展了一半(0.5),高度为0.25 刚好延伸到ax1的最底部

希望对你有所帮助


这里有一个更具体的示例及其结果。请注意,蜡烛图和成交量图仅占图形的左上象限

fig = mpf.figure(figsize=(8,8),style='yahoo')

ax1 = fig.add_axes([0.05,0.75,0.5,0.25])
ax2 = fig.add_axes([0.05,0.50,0.5,0.25])

mpf.plot(df,type='candle',ax=ax1,volume=ax2)
mpf.show()

enter image description here


非常感谢,Daniel!这解释得很清楚,正是我想要的!我会在代码中尝试使用add_axes()函数,并将更新后的图表发布在这里。干杯! - undefined

0

不需要那么长的代码,使用下面的代码即可。假设您有要在 mplfinance 中绘制图表的音量和数据。

mpf.plot(data,type='candle',style='yahoo',volume=True)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接