Задача Matplotlib: повторное отображение тиковых осей данных временных рядов - PullRequest
0 голосов
/ 16 января 2020

Я хочу построить данные временных рядов, используя MatPlotLib. Данные хранятся в формате CSV, который я обрабатываю в Pandas DataFrame, используя pd.read_csv(), который работает нормально. Набор данных содержит один столбец отметки времени и около 10 столбцов значений. Я конвертирую метку времени (изначально строка в формате гггг-ММ-дд чч: мм: сс) через pd.to_datetime(dataFrame['TIMESTAMP'], format='%Y-%m-%d %H:%M:%S') к дате и времени.

Для построения графика данных я использую следующий код (генерация данных примера не является частью моего кода):

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns

N = 30
timestamps = pd.date_range('2020-01-16 8:00', periods=N, freq='72s')
# note: the original timestamps aren't evenly spaced, this is just data to test
dataFrame = pd.DataFrame({'TIMESTAMP': timestamps, 'Y1': np.random.normal(100, 30, N), 'Y2': np.random.normal(100, 30, N)})
acqFieldName = 'Y1'

fig = sns.pointplot(x='TIMESTAMP', y=acqFieldName, data=dataFrame, scale=0.75)
timestamps = dataFrame['TIMESTAMP'].dt.time
fig.axes.set_xticklabels(labels=timestamps, rotation=45)
plt.show()

Что приводит к следующему:

Plot resulting from code above

Тем не менее, я хотел бы изменить ось х: тики слишком плотные, поэтому я бы хотел, скажем, 10 тиков, и хотел бы видеть время, проведенное в минутах, в формате «мм: сс».

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

fig = sns.pointplot(x='TIMESTAMP', y=acqFieldName, data=dataFrame, scale=0.75)
timestamps = dataFrame['TIMESTAMP'].dt.time

xmin = dataFrame['TIMESTAMP'][0]
xmax = dataFrame['TIMESTAMP'][len(dataFrame['TIMESTAMP']) - 1]

timeDiff: timedelta = xmax - xmin
customTicks = np.linspace(0., timeDiff.seconds, 10)
fig.axes.set_xticklabels(labels=customTicks, rotation=45)
fig.axes.set_xticks(customTicks)
plt.show()

Что приводит к следующему:

enter image description here

явно не то, что я хочу.

Моя проблема была бы решена, если бы я мог уменьшить количество тиков, отформатированных как время, или - лучше - если бы точки совпали с тиками, указанными как потраченное время.

Обновление: предложение урожая Зараки Кенпачи

    fig, ax = plt.subplots()
    ax.plot(dataFrame.set_index('TIMESTAMP'), dataFrame[acqFieldName])
    plt.show()

enter image description here


Рабочий раствор на основе ответа Йохана C:

приводит к:

Final plot

Ответы [ 2 ]

1 голос
/ 16 января 2020

Основная путаница возникает из-за этого точечного графика Seaborn, в котором числа x отмечены цифрами 0,1,2, ... и создаются для них запутанные метки.

Чтобы получить то, что вы хотите, вы можете просто поставьте галочки каждый, скажем, 5. И предоставьте им собственные метки. Также добавьте второстепенные тики, чтобы иметь один тик для каждой записи.

Демонстрационный код:

import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator
import pandas as pd
import numpy as np
import seaborn as sns

N = 30
timestamps = pd.date_range('2020-01-16 8:00:00', periods=N, freq='73s')
dataFrame = pd.DataFrame({'TIMESTAMP': timestamps, 'Y1': np.random.normal(100, 30, N), 'Y2': np.random.normal(100, 30, N)})

fig = sns.pointplot(x='TIMESTAMP', y='Y1', data=dataFrame, scale=0.75)

custom_ticks = range(0, len(dataFrame), 5) # ticks every 5
timestamps = [f"{dataFrame['TIMESTAMP'][t].minute:02}:{dataFrame['TIMESTAMP'][t].second:02}" for t in custom_ticks]

fig.axes.set_xticklabels(timestamps)
fig.axes.set_xticks(custom_ticks)
fig.axes.xaxis.set_minor_locator(AutoMinorLocator())

plt.tight_layout()
plt.show()

demo plot

0 голосов
/ 16 января 2020

Попробуйте простой сюжет:

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(df.set_index('TIMESTAMP'), df[acqFieldName])
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...