【问题标题】:Plot multiple mplfinance plots sharing x axis绘制多个共享 x 轴的 mplfinance 图
【发布时间】:2021-12-15 00:20:28
【问题描述】:

我正在尝试用mplfinance 绘制 5 个图表,一个在另一个之下。

这行得通:

for coin in coins:
    mpf.plot(df_coins[coin], title=coin, type='line', volume=True, show_nontrading=True)

但是,在我的 Python Notebook 单元格输出中,每个图都是一个单独的图像。并且对每张图片重复x轴标注。

我尝试制作一个包含多个子图/轴的图形,并在每个轴上绘制一个图表:

from matplotlib import pyplot as plt

N = len(df_coins)
fig, axes = plt.subplots(N, figsize=(20, 5*N), sharex=True)

for i, ((coin, df), ax) in zip(enumerate(df_coins.items()), axes):
    mpf.plot(df, ax=ax, title=coin, type='line', volume=True, show_nontrading=True)

这会显示正确尺寸的子图,但它们不会填充数据。轴标记为 0.0 到 1.0,并且标题未出现。

我错过了什么?

【问题讨论】:

    标签: matplotlib subplot mplfinance


    【解决方案1】:

    除了@r-beginners 提到的技术之外,还有另一种技术可能适合您在所有绘图共享相同 x 轴的情况下。也就是使用mpf.make_addplot()

    aps = []
    for coin in coins[1:]:
        aps.append(mpf.make_addplot(df_coins[coin]['Close'], title=coin, type='line'))
    
    coin = coins[0]
    mpf.plot(df_coins[coin],axtitle=coin,type='line',volume=True,show_nontrading=True,addplot=aps)
    

    如果你选择做type='candle'而不是'line',那么改变

    df_coins[coin]['Close']
    

    简单

    df_coins[coin]
    

    【讨论】:

    • 我的第一次尝试是使用make_add_plot(),但由于需要数据框的错误,我无法做到这一点。我看到基本图需要一个包含 ohlc 值的数据框。我学会了。
    • @r-beginners 是的,mpf.plot() 始终需要 OHLC DataFrame(或 OHLCV)。而mpf.make_addplot() 接受列表、数组或系列。一个例外是如果在对make_addplot()type='candle'type='ohlc' 的调用中,那么make_addplot() 也将需要一个OHLC DataFrame。
    • 感谢您的详细解释。我又对 mpf 有了更好的理解。
    【解决方案2】:

    子图有两种方法。一种是用 mplfinance 对象建立一个图形。另一种方法是使用您采用的 matplotlib 子图来放置它。

    yfinace 数据

    import matplotlib.pyplot as plt
    import mplfinance as mpf
    import yfinance as yf
    
    tickers = ['AAPL','GOOG','TSLA']
    data = yf.download(tickers, start="2021-01-01", end="2021-03-01", group_by='ticker')
    
    aapl = data[('AAPL',)]
    goog = data[('GOOG',)]
    tsla = data[('TSLA',)]
    

    金融业

    fig = mpf.figure(style='yahoo', figsize=(12,9))
    #fig.subplots_adjust(hspace=0.3)
    ax1 = fig.add_subplot(3,1,1, sharex=ax3)
    ax2 = fig.add_subplot(3,1,2, sharex=ax3)
    ax3 = fig.add_subplot(3,1,3)
    
    mpf.plot(aapl, type='line', ax=ax1, axtitle='AAPL', xrotation=0)
    mpf.plot(goog, type='line', ax=ax2, axtitle='GOOG', xrotation=0)
    mpf.plot(tsla, type='line', ax=ax3, axtitle='TSLA', xrotation=0)
    ax1.set_xticklabels([])
    ax2.set_xticklabels([])
    

    ma​​tplotlib

    N = len(tickers)
    fig, axes = plt.subplots(N, figsize=(20, 5*N), sharex=True)
    
    for df,t,ax in zip([aapl,goog,tsla], tickers, axes):
        mpf.plot(df, ax=ax, axtitle=t, type='line', show_nontrading=True)# volume=True 
    
    

    【讨论】:

    • 不支持体积子图,因此从设置中删除。请参考official reference 中的示例。我不知道虚拟货币的名称,所以我使用了股票数据。
    • 不支持体积子图是,当您处于外轴模式时,mplfinance 确实知道将音量放在哪里除非你告诉它。因此,而不是 volume=True 你必须写 volume=vaxes 其中vaxes 是你创建的轴,你希望卷在哪里!
    猜你喜欢
    • 2010-11-27
    • 2019-07-13
    • 2021-03-14
    • 2019-01-06
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    相关资源
    最近更新 更多