How to change the datetime tick label frequency for Matplotlib plots?

When plotting time series data in Matplotlib, you often need to control how datetime tick labels appear on the x-axis. By default, Matplotlib may create too many or too few tick labels, making the plot hard to read. You can customize the frequency using locators and formatters from the matplotlib.dates module.

Basic Datetime Tick Control

Here's how to create a time series plot and control the datetime tick frequency ?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# Set figure size
plt.rcParams["figure.figsize"] = [10, 6]
plt.rcParams["figure.autolayout"] = True

# Create sample data
index = pd.date_range(start="2020-07-01", end="2021-01-01", freq="D")
data = np.random.randint(1, 100, size=len(index))
df = pd.DataFrame(data=data, index=index, columns=['value'])

# Create plot
ax = df.plot()

# Set major ticks every month
ax.xaxis.set_major_locator(mdates.MonthLocator(interval=1))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))

# Rotate date labels for better readability
plt.gcf().autofmt_xdate()

plt.title('Time Series with Monthly Tick Labels')
plt.show()

Different Tick Frequencies

You can use different locators to control tick frequency ?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# Create sample data
dates = pd.date_range('2023-01-01', periods=100, freq='D')
values = np.cumsum(np.random.randn(100)) + 100

fig, axes = plt.subplots(2, 2, figsize=(12, 8))
fig.suptitle('Different DateTime Tick Frequencies')

# Weekly ticks
axes[0,0].plot(dates, values)
axes[0,0].xaxis.set_major_locator(mdates.WeekdayLocator(interval=2))
axes[0,0].xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
axes[0,0].set_title('Every 2 Weeks')
axes[0,0].tick_params(axis='x', rotation=45)

# Daily ticks (every 10 days)
axes[0,1].plot(dates, values)
axes[0,1].xaxis.set_major_locator(mdates.DayLocator(interval=10))
axes[0,1].xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
axes[0,1].set_title('Every 10 Days')
axes[0,1].tick_params(axis='x', rotation=45)

# Monthly ticks
axes[1,0].plot(dates, values)
axes[1,0].xaxis.set_major_locator(mdates.MonthLocator())
axes[1,0].xaxis.set_major_formatter(mdates.DateFormatter('%B'))
axes[1,0].set_title('Monthly')
axes[1,0].tick_params(axis='x', rotation=45)

# Auto locator
axes[1,1].plot(dates, values)
axes[1,1].xaxis.set_major_locator(mdates.AutoDateLocator())
axes[1,1].xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
axes[1,1].set_title('Auto Locator')
axes[1,1].tick_params(axis='x', rotation=45)

plt.tight_layout()
plt.show()

Common Locators and Formatters

Locator Purpose Example Usage
YearLocator() Yearly ticks YearLocator(interval=2)
MonthLocator() Monthly ticks MonthLocator(interval=3)
WeekdayLocator() Weekly ticks WeekdayLocator(byweekday=0)
DayLocator() Daily ticks DayLocator(interval=7)
HourLocator() Hourly ticks HourLocator(interval=6)

Custom Formatting Example

Here's how to create custom date formatting with minor ticks ?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# Create sample data spanning several months
dates = pd.date_range('2023-01-01', '2023-06-30', freq='D')
values = np.random.randn(len(dates)).cumsum() + 50

plt.figure(figsize=(12, 6))
plt.plot(dates, values, linewidth=2)

# Major ticks every month
plt.gca().xaxis.set_major_locator(mdates.MonthLocator())
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%B %Y'))

# Minor ticks every week
plt.gca().xaxis.set_minor_locator(mdates.WeekdayLocator())

# Customize appearance
plt.grid(True, which='major', alpha=0.7)
plt.grid(True, which='minor', alpha=0.3)
plt.title('Custom DateTime Formatting with Major and Minor Ticks')
plt.ylabel('Value')

# Rotate and align the tick labels
plt.gcf().autofmt_xdate()

plt.show()

Conclusion

Use matplotlib.dates locators to control datetime tick frequency and formatters to customize their appearance. The autofmt_xdate() method automatically rotates labels for better readability. Choose appropriate intervals based on your data's time range to avoid overcrowded or sparse tick labels.

Updated on: 2026-03-25T23:08:30+05:30

6K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements