簡體   English   中英

多個matplotlib子圖:將熊貓數據框HTML與每個子圖交錯

[英]multiple matplotlib subplots: interleave pandas dataframe HTML with each subplot

我有一個多行的pandas.DataFrame (我要檢查的每筆交易1個)

trades = pandas.read_csv(...)

我想在matplotlib子圖中繪制每筆交易。 我使用len(trades)創建pyplot.figure以創建足夠的高度

fig = pyplot.figure(figsize=(40,15 * len(trades)))

然后,我遍歷每筆交易並生成一個圖

for i,r in enumerate(trades.iterrows()):
    _, trade = r

    start = trade.open_time  - datetime.timedelta(seconds=30)
    end   = trade.close_time + datetime.timedelta(seconds=30) 

    b = bids[start:end]
    a = asks[start:end]

    ax = fig.add_subplot(len(trades),1,i+1)

    # plot bid/ask
    ax.plot_date(b.index, b, fmt='-',  label='bid')
    ax.plot_date(a.index, a, fmt='-',  label='ask')

    # plot entry/exit markers
    ax.plot(trade.open_time,  trade.open_price,  marker='o', color='b')
    ax.plot(trade.close_time, trade.close_price, marker='o', color='r')

    ax.set_title("Trade {}".format(i+1, fontsize=10)
    ax.set_xlabel("Date")
    ax.set_ylabel("Price")

    ax.legend(loc='best', fontsize='large')

pyplot.show()

# free resources
pyplot.close(fig.number) 

這很好。

但是,現在,我想顯示有關交易的數據框的渲染HTML。

由於我是在jupyter筆記本中執行此操作的,因此從此SO答案中,我能夠找到以下片段,這些片段將以html顯示我的數據框:

t = pandas.DataFrame(trades.iloc[i]).T
IPython.display.display(IPython.display.HTML(t.to_html())

我將此代碼段插入循環中。

問題在於,每筆交易的渲染HTML數據框都是一個接一個地打印的,然后在所有數據框都打印完之后,打印圖。

+-----------+
| dataframe |
+-----------+
+-----------+
| dataframe |
+-----------+
+-----------+
| dataframe |
+-----------+
+------+
|      |
| plot |
|      |
+------+
+------+
|      |
| plot |
|      |
+------+
+------+
|      |
| plot |
|      |
+------+

鑒於我已經創建了一個大的pyplot.figure ,並且在循環之后調用了pyplot.show() ,這很有意義-在循環內部我輸出數據幀HTML,並在循環之后顯示該圖。

題:

如何交錯筆記本HTML和每個子圖?

+-----------+
| dataframe |
+-----------+
+------+
|      |
| plot |
|      |
+------+
+-----------+
| dataframe |
+-----------+
+------+
|      |
| plot |
|      |
+------+
+-----------+
| dataframe |
+-----------+
+------+
|      |
| plot |
|      |
+------+

我相信您需要創建三個單獨的圖形並在循環內調用plt.show() 這樣的事情(注意,我認為 pyplot.close使用Jupyter筆記本前端pyplot.close):

trades = pandas.read_csv(...)

for i, r in enumerate(trades.iterrows()):
    _, trade = r

    start = trade.open_time  - datetime.timedelta(seconds=30)
    end   = trade.close_time + datetime.timedelta(seconds=30) 

    b = bids[start:end]
    a = asks[start:end]

    fig, ax = plt.subplots(figsize=(40, 15))

    # plot bid/ask
    ax.plot_date(b.index, b, fmt='-',  label='bid')
    ax.plot_date(a.index, a, fmt='-',  label='ask')

    # plot entry/exit markers
    ax.plot(trade.open_time,  trade.open_price,  marker='o', color='b')
    ax.plot(trade.close_time, trade.close_price, marker='o', color='r')

    ax.set_title("Trade {}".format(i+1, fontsize=10))
    ax.set_xlabel("Date")
    ax.set_ylabel("Price")

    ax.legend(loc='best', fontsize='large')

    t = pandas.DataFrame(trades.iloc[i]).T
    IPython.display.display(IPython.display.HTML(t.to_html())

    pyplot.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM