несколько вспомогательных сюжетов matplotlib: чередуйте HTML-код pandas с каждым вложенным сюжетом - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть pandas.DataFrame с несколькими строками (1 на сделку, которую я хочу проверить)

trades = pandas.read_csv(...)

Я хочу построить каждую сделку на подспоте matplotlib.Я создаю pyplot.figure, используя len(trades), чтобы создать достаточную высоту

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 |
|      |
+------+

1 Ответ

0 голосов
/ 22 ноября 2018

Я считаю, что вам нужно создать три отдельные фигуры и вызвать plt.show() в цикле.Примерно так (примечание: я не думаю нужно pyplot.close с помощью интерфейса ноутбука Jupyter):

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...