Уменьшите количество xticks в matplotlib динамически при построении данных о ценах в зависимости от времени - PullRequest
1 голос
/ 05 августа 2020

Мой python скрипт matplotlib:

plt.plot(graphdf["Price"],color='red')
plt.xticks(rotation=90)

Нужна помощь в динамическом уменьшении количества тиков , моя программа непрерывно обрабатывает данные и при их построении ось x через некоторое время становится беспорядочной, например, после 40 меток xtick.

(у меня нет фиксированного количества точек данных, оно продолжает расти каждый раз, когда моя программа собирает дополнительные данные. Например: в 9 : 37 У меня будет всего 3 точки данных, в 9:45 у меня будет 5 точек данных и т. Д. c. Я постоянно рисую их на графике ниже)

У меня есть простой набор данных с ценой и Время (цены на фондовом рынке) вроде этого: pandas фрейм данных

У меня такой график График зависимости цены от времени

1 Ответ

2 голосов
/ 05 августа 2020

Вариант 1: ось x datetime тип

Ответ

Я полагаю, ваши данные находятся в файле с именем data.csv. Если вы загружаете его с pd.read_csv, вам нужно обратить внимание на формат столбца 'Time'. Посмотрите на вывод:

print(graphdf.info())

Если DType столбца 'Time' равно object, pandas идентифицирует значения этого столбца как str. В этом случае вам нужно преобразовать их в datetime с помощью:

graphdf['Time'] = pd.to_datetime(graphdf['Time'], format = '%H:%M')

Наконец, вы можете установить формат меток, которые вы видите на оси x, с помощью:

ax.xaxis.set_major_formatter(md.DateFormatter('%H:%M'))

Отметьте этот ответ для справки.

Весь код

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as md

graphdf = pd.read_csv('data.csv')
graphdf['Time'] = pd.to_datetime(graphdf['Time'], format = '%H:%M')

fig, ax = plt.subplots()

ax.plot(graphdf['Time'],graphdf['Price'],color='red')
plt.xticks(rotation=90)
ax.xaxis.set_major_formatter(md.DateFormatter('%H:%M'))

plt.show()

График

enter image description here


Option 2: x axis str type

Answer

In the case you do not want x axis as a general time %H:%M axis, but you want to keep your original ticks, you have to mantain the x axis as a str type and simply sample original ticks, then apply them to the axis:

xticks = graphdf['Time'][::2]
ax.set_xticks(xticks)

You can срез исходные отметки с [::n], где n - шаг. Если n = 2 вы выбираете альтернативные отметки; если n = 3 ставить галочку каждые 3 и т. д.

Весь код

import pandas as pd
import matplotlib.pyplot as plt

graphdf = pd.read_csv('data.csv')

fig, ax = plt.subplots()

ax.plot(graphdf['Time'],graphdf['Price'],color='red')
plt.xticks(rotation=90)
xticks = graphdf['Time'][::2]
ax.set_xticks(xticks)

plt.show()

Участок

введите описание изображения здесь

...