Почему график отображается по-разному между датой использования оси X и списком чисел использования оси X на matplotlib? - PullRequest
1 голос
/ 01 мая 2019

У меня есть данные о запасах, которые содержат атрибут ohlc, и я хочу построить график индикатора RSI, рассчитав значение закрытия. Поскольку данные об акциях отсортированы по дате, дату необходимо изменить на число, используя date2num. Но результат вычисления атрибута close становится списком значений RSI при наложении графика.

Я думаю, что длина результатов RSI не совпадает с длиной даты, но после того, как я проверил, выполнив len(rsi) == len(df ['date']), отобразите ту же длину. Затем я стараюсь не использовать дату по оси X, а список чисел, составленный range(0, len(df['date'])), и сюжет показывают, как я ожидал.

#get data
df = df.tail(1000)

#covert date
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(mdates.date2num)

#make indicator wit TA-Lib
rsi = ta.RSI(df['close'], timeperiod=14)

#plot rsi indicator wit TA-Lib
ax1.plot(df['date'], rsi)
ax2.plot(range(0, len(df['date'])), rsi)

#show chart
plt.show()

Я ожидаю, что вывод с использованием даты по оси X будет таким же, как список чисел по оси X

Изображение, показывающее разницу

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

После нескольких попыток я нашел суть проблемы.По выходным данные не записываются, поэтому на дате есть пробел.Дате по оси X в matplotlib будет дан разрыв по выходным, даже если в этот день нет данных, поэтому линейный график будет перекрываться.

Для решения, которое я не нашел, но для времениЯ использую список номеров.

0 голосов
/ 01 мая 2019

Похоже, что matplotlib выбирает x-ticks для отображения (при выборе автоматически) для отображения «круглых» чисел.Так что в вашем случае целых чисел, отметьте каждые 200;в вашем случае дат, каждые два месяца.

Вы, похоже, ожидаете, что даты будут следовать тем же шагам галочки, что и целые числа, но это приведет к тому, что на графике будут показаны произвольные даты в середине месяца, что не является хорошим поведением по умолчанию.

Если вы хотите именно такое поведение, попробуйте что-то вроде этого:

rng = range(len(df['date']))
ax2.plot(rng, rsi)  # Same as in your example
ax2.set_xlim((rng[0], rng[-1]))  # Make sure no ticks outside of range
ax2.set_xticklabels(df['date'].iloc[ax2.get_xticks()])  # Show respective dates in the locations of the integers

Это поведение, конечно, можно изменить, если вы хотите показывать числа вместо дат, используя те же метки, что и даты, но я оставлю это тебе.

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