Higashi Yutaka
Higashi Yutaka

Reputation: 181

How to reset x tick labels in matplotlib

I have 5 time series data in DataFrames and each of them have a different time scale. For example, data1 is from 4/15 0:00 to 4/16 0:00, data2 is from 9/16 06:30 to 7:00. All these data are in different DataFrames and I wanna draw graphs of them by using matplotlib. I want to set the numbers of x tick labels 5 and put a date of the data just on the leftmost x tick label. I tried the code below but I couldn't get graphs I wanted.

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()

And I got a graph like this enter image description here

Again, I want to set the numbers of x tick labels to 5 and put a date just on the leftmost x tick label on every graph. And hopefully, I want to rotate the characters of x tick labels. Could anyone teach me how to get graphs I want?

df_event_num has 5 DataFrames and I want to make time series graphs of the column data named 'Load_Avg'. Here is the sample data of '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

Upvotes: 0

Views: 3212

Answers (1)

ilja
ilja

Reputation: 2682

I modified your code a little bit:

  • You do not need to use range() to loop over, you can iterate directly over the list of DataFrames

  • Use the created ax subplot to set the data and the title on it.

  • Create 5 linear separated ticks on the x-axis based on the first and last index of the individual dataframe: pd.to_datetime(np.linspace(df.index[0].value, df.index[-1].value, 5))

  • Use just the last value as label, and replace all other with empty stings: 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

Upvotes: 1

Related Questions