Как сбросить метки x tick в matplotlib - PullRequest
0 голосов
/ 09 июля 2019

У меня есть 5 данных временных рядов в DataFrames, и у каждого из них есть свой временной масштаб. Например, data1 - с 4/15 0:00 до 4/16 0:00, data2 - с 9/16 06:30 до 7:00. Все эти данные находятся в разных DataFrames, и я хочу нарисовать их графики с помощью matplotlib. Я хочу установить количество меток x для отметки 5 и поместить дату данных только на крайнюю левую отметку для отметки x. Я попробовал код ниже, но я не мог получить графики, которые я хотел.

fig = plt.figure(figsize=(15, 3))
for i in range(1,6):    # because I have 5 DataFrames in 'df_event_num'
    ax = plt.subplot(150+i)
    plt.title('event_num{}'.format(i))
    df_event_num[i-1]['Load_Avg'].plot(color=colors_2018[i-1])
    ax.tick_params(rotation=270)
fig.tight_layout()

И я получил такой график enter image description here

Опять же, я хочу установить количество меток x на 5 и поставить дату только на крайнем левом метке x на каждом графике. И, надеюсь, я хочу повернуть символы меток тика. Может ли кто-нибудь научить меня, как получить графики, которые я хочу?

df_event_num имеет 5 DataFrames, и я хочу сделать графики временных рядов данных столбца с именем «Load_Avg». Вот пример данных «df_event_num».

print(df_event_num[0]['Load_Avg'])
>>>
TIMESTAMP
2018-04-15 00:00:00    406.2
2018-04-15 00:30:00    407.4
2018-04-15 01:00:00    409.6
2018-04-15 01:30:00    403.3
2018-04-15 02:00:00    405.0
2018-04-15 02:30:00    401.8
2018-04-15 03:00:00    401.1
2018-04-15 03:30:00    401.0
2018-04-15 04:00:00    402.3
2018-04-15 04:30:00    402.5
2018-04-15 05:00:00    404.3
2018-04-15 05:30:00    404.7
2018-04-15 06:00:00    417.0
2018-04-15 06:30:00    438.9
2018-04-15 07:00:00    466.4
2018-04-15 07:30:00    476.6
2018-04-15 08:00:00    499.3
2018-04-15 08:30:00    523.1
2018-04-15 09:00:00    550.2
2018-04-15 09:30:00    590.2
2018-04-15 10:00:00    604.4
2018-04-15 10:30:00    622.4
2018-04-15 11:00:00    657.7
2018-04-15 11:30:00    737.2
2018-04-15 12:00:00    775.0
2018-04-15 12:30:00    819.0
2018-04-15 13:00:00    835.0
2018-04-15 13:30:00    848.0
2018-04-15 14:00:00    858.0
2018-04-15 14:30:00    866.0
2018-04-15 15:00:00    874.0
2018-04-15 15:30:00    879.0
2018-04-15 16:00:00    883.0
2018-04-15 16:30:00    889.0
2018-04-15 17:00:00    893.0
2018-04-15 17:30:00    894.0
2018-04-15 18:00:00    895.0
2018-04-15 18:30:00    897.0
2018-04-15 19:00:00    895.0
2018-04-15 19:30:00    898.0
2018-04-15 20:00:00    899.0
2018-04-15 20:30:00    900.0
2018-04-15 21:00:00    903.0
2018-04-15 21:30:00    904.0
2018-04-15 22:00:00    905.0
2018-04-15 22:30:00    906.0
2018-04-15 23:00:00    906.0
2018-04-15 23:30:00    907.0
2018-04-16 00:00:00    909.0
Freq: 30T, Name: Load_Avg, dtype: float64

print(df_event_num[1]['Load_Avg'])
>>>
TIMESTAMP
2018-04-25 06:30:00    1133.0
2018-04-25 07:00:00    1159.0
Freq: 30T, Name: Load_Avg, dtype: float64
print(df_event_num[2]['Load_Avg'])
TIMESTAMP
2018-06-28 09:30:00     925.0
2018-06-28 10:00:00    1008.0
Freq: 30T, Name: Load_Avg, dtype: float64
print(df_event_num[3]['Load_Avg'])
>>>
TIMESTAMP
2018-09-08 00:00:00    769.3
2018-09-08 00:30:00    772.4
2018-09-08 01:00:00    778.3
2018-09-08 01:30:00    787.5
2018-09-08 02:00:00    812.0
2018-09-08 02:30:00    825.0
2018-09-08 03:00:00    836.0
2018-09-08 03:30:00    862.0
2018-09-08 04:00:00    884.0
2018-09-08 04:30:00    905.0
2018-09-08 05:00:00    920.0
2018-09-08 05:30:00    926.0
2018-09-08 06:00:00    931.0
2018-09-08 06:30:00    942.0
2018-09-08 07:00:00    948.0
2018-09-08 07:30:00    956.0
2018-09-08 08:00:00    981.0
Freq: 30T, Name: Load_Avg, dtype: float64
print(df_event_num[4]['Load_Avg'])
>>>
TIMESTAMP
2018-09-30 21:00:00    252.2
2018-09-30 21:30:00    256.5
2018-09-30 22:00:00    264.1
2018-09-30 22:30:00    271.1
2018-09-30 23:00:00    277.7
2018-09-30 23:30:00    310.0
2018-10-01 00:00:00    331.6
2018-10-01 00:30:00    356.3
2018-10-01 01:00:00    397.2
2018-10-01 01:30:00    422.4
2018-10-01 02:00:00    444.2
2018-10-01 02:30:00    464.7
2018-10-01 03:00:00    477.2
2018-10-01 03:30:00    487.2
2018-10-01 04:00:00    494.7
2018-10-01 04:30:00    515.2
2018-10-01 05:00:00    527.6
2018-10-01 05:30:00    537.5
2018-10-01 06:00:00    541.7
Freq: 30T, Name: Load_Avg, dtype: float64

1 Ответ

1 голос
/ 09 июля 2019

Я немного изменил ваш код:

  • Вам не нужно использовать range() для зацикливания, вы можете выполнять итерацию непосредственно над list из DataFrames

  • Используйте созданный субплот ax для установки данных и заголовка на них.

  • Создайте 5 линейно разделенных галочек на оси xна основе первого и последнего индекса отдельного кадра данных: pd.to_datetime(np.linspace(df.index[0].value, df.index[-1].value, 5))

  • Используйте в качестве метки только последнее значение и замените все остальные пустыми значениями: ts_names = ['','','','',ts_loc[-1]]

import numpy as np

colors_2018 = ['red', 'blue', 'green', 'yellow', 'orange', 'brown']

fig = plt.figure(figsize=(15, 4))
for i, df in enumerate(df_event_num):    # because I have 5 DataFrames in 'df_event_num'
    ax = plt.subplot(1,5,i+1)
    ax.plot(df['Load_Avg'], color=colors_2018[i])
    ax.set_title('event_num{}'.format(i))

    # If the index is not a Timestamp-type already:
    df.index = pd.to_datetime(df.index)

    # x-Axis locations of 5 timestamps
    ts_loc = pd.to_datetime(np.linspace(df.index[0].value, df.index[-1].value, 5))
    ax.set_xticks(ts_loc, minor=False)

    # Names of the timestamps (only last shown)
    ts_names = ['','','','',ts_loc[-1]]
    ax.set_xticklabels(ts_names, rotation="vertical") 

fig.tight_layout()

enter image description here

...