Как добавить патч в финансовую диаграмму Matplotlib / Matplotlib? - PullRequest
1 голос
/ 17 июня 2020

Я создал свечной график, используя следующее:

fig, axlist = mpf.plot(df, type='candle', returnfig=True)

Теперь я пытаюсь добавить прямоугольник, который идет от определенной точки оси x к другой точке оси x в позиции y . Теперь данные на оси x - это даты, а данные на оси y - цены.

Я пробовал следующее:

ax1 = axlist[0]

new_patch = Rectangle(xy=(0, 9300), width=0.8, height=0.3, angle=0, color='orange')
ax1.add_patch(new_patch)
ax1.autoscale_view()

Какой работает , проблема в том, что я не хочу использовать число для выбора позиции X. В Rectangle(xy=(0, 9300), кроме использования 0, я хочу использовать дату, например Rectangle(xy=('2020-06-17 10:30', 9300), но это вызовет у меня ошибку: x должен быть int.

Вот образец фрейма данных, который я использую для построения диаграммы:

                                   Date     Open     High      Low    Close      Volume
Date
2020-06-17 19:10:00 2020-06-17 19:10:00  9402.02  9411.03  9400.00  9403.59  215.630925
2020-06-17 19:15:00 2020-06-17 19:15:00  9403.59  9412.54  9403.01  9410.57  108.958008
2020-06-17 19:20:00 2020-06-17 19:20:00  9410.16  9413.66  9409.06  9411.88  107.795579

Подводя итог: мне нужно нанести патч на график, я могу разместить этот патч на x ось, используя число, но вместо этого я хочу использовать дату. Есть ли способ сделать это?

Изменить: я попробовал предложенное решение здесь , но оно не сработало:

date = datetime.datetime(2020, 6, 19, 10, 30)
testDate = mdates.date2num(date)
print(testDate)

new_patch = Rectangle(xy=(testDate, 9370), width=1, height=0.3, angle=0, color='orange')
ax1.add_patch(new_patch)
ax1.autoscale_view()

Поскольку оно дало мне абсурдный результат:

1 Ответ

2 голосов
/ 20 июня 2020

Различные библиотеки, разные реализации

mplfinance может генерировать график только в том случае, если фрейм данных использует DatetimeIndee; поэтому необходимо заранее использовать pd.to_datetime. Когда вы поместили этот график в фигуру matplotlib, чтобы применить к нему патч, matplotlib не смог обработать значения x как даты, поскольку они не были представлены ему как таковые.

Что он сделал. вместо этого нужно было заменить их списком целочисленных значений, начинающихся с 0. Вот почему, когда вы присвоили x-значение патча testDate, то есть 737595.4375, все было сжато после автоматического масштабирования оси x.

Решение

Одним из способов решения этой проблемы является сохранение столбца dataframe Date в индексированном массиве, а затем получение индекса соответствующей даты:

unique_index = pd.Index(df["Date"])
start_x = unique_index.get_loc('2020-06-17 19:10:00')

Если вы хотите нарисовать патч в дату, отсутствующую в фрейме данных, вам нужно будет найти индекс, который находится непосредственно перед начальной точкой, и добавить к любому числу от 0 до 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...