Matplotlib миллисекунд тик по оси X - PullRequest
4 голосов
/ 08 апреля 2020

Я пытаюсь построить данные временных рядов из файла CSV, используя Matplotlib. Ниже приведены первые несколько строк из файла csv.

YYYY-MO-DD HH-MI-SS_SSS,X,Y,Z
2019-12-15 11:01:35.000,-0.2937,0.8477,2.2274
2019-12-15 11:01:35.005,-0.2937,0.8477,2.2274
2019-12-15 11:01:35.010,-0.2937,0.8477,2.2274
2019-12-15 11:01:35.014,0.3231,-1.7574,-4.6244
2019-12-15 11:01:35.021,0.3231,-1.7574,-4.6244
2019-12-15 11:01:35.025,0.3231,-1.7574,-4.6244
2019-12-15 11:01:35.030,0.7319,-4.9294,-4.6236
2019-12-15 11:01:35.035,0.7319,-4.9294,-4.6236

Интервал составляет 5 миллисекунд (200 Гц), и файл содержит данные за одну секунду (200 строк). Моя цель - устанавливать основные x-тики каждые 100 миллисекунд, а именно:

35.000, 35.100, 35.200, ...., 35.800, 35.900

Я пытался использовать dateFormatter, но не могу управлять. Как я могу это сделать?

#import packages
from matplotlib import pyplot as plt
from matplotlib import dates
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
import pandas as pd
import numpy as np
#import math
%matplotlib inline

df = pd.read_csv("one-second.csv",index_col="YYYY-MO-DD HH-MI-SS_SSS",parse_dates=True)

fig_1, axes = plt.subplots(3, 1, figsize=(12,12),constrained_layout=True)
axes[0].plot(df['X'],color='red')
axes[0].xaxis.set_major_formatter(dates.DateFormatter("%S.%f"))
axes[0].set_title("X Signal")
axes[0].set_xlabel('Time')
axes[0].set_ylabel('Amplitude')
axes[1].plot(df['Y'],color='green')
axes[1].set_title("Y Signal")
axes[1].set_xlabel('Time')
axes[1].set_ylabel('Amplitude')
axes[2].plot(df['Z'],color='blue')
axes[2].set_title("Z Signal")
axes[2].set_xlabel('Time')
axes[2].set_ylabel('Amplitude')

Вот как я пока управляю.

plot so far

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Самый простой способ - установить индекс DataFrame непосредственно на значения в миллисекундах. Затем вы можете указать понравившиеся тики в качестве простого диапазона, например:

import pandas as pd
import numpy as np
%matplotlib inline

df = pd.read_csv("one-second.csv", parse_dates=True) 
df.index = np.arange(start=0, stop=5*len(df), step=5)

df.plot(xticks=np.arange(start=0, stop=5*len(df), step=100))
1 голос
/ 08 апреля 2020

Спасибо за ваш вклад, это помогло мне копать дальше и найти (возможно) лучший метод, как показано ниже.

ax2 = df['Y'].plot(figsize=(12,5),color='red')
ax2.set(xlabel='second.microseconds')
ax2.xaxis.set_major_locator(dates.MicrosecondLocator(interval=100000, tz=None))
ax2.xaxis.set_major_formatter(dates.DateFormatter('%S.%f'))

enter image description here

1 голос
/ 08 апреля 2020

Мне потребовалось некоторое время, чтобы обернуть голову вокруг этого ...

Сначала создайте массив datetime, используя np.datetime64:

custom_array=np.arange(np.datetime64('2019-12-15 11:01:35.0'), np.datetime64('2019-12-15 11:01:36.0'),dtype='datetime64[100ms]')

Это вернет:

массив (['2019-12-15T11: 01: 35.000', '2019-12-15T11: 01: 35.100', '2019-12-15T11: 01: 35.200', '2019-12- 15T11: 01: 35.300 ',' 2019-12-15T11: 01: 35.400 ',' 2019-12-15T11: 01: 35.500 ',' 2019-12-15T11: 01: 35.600 ',' 2019-12-15T11: 01: 35.700 ',' 2019-12-15T11: 01: 35.800 ',' 2019-12-15T11: 01: 35.900 '], dtype =' datetime64 [100ms] ')

Затем используйте этот пользовательский массив для установки тиков:

axes[0].xaxis.set_ticks(custom_array) axes[0].xaxis.set_major_formatter(dates.DateFormatter("%S.%f"))

Это создаст тиковую метку каждые 100 миллисекунд, начиная с 11: 01: 35:

enter image description here

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