I have been working with Python and Matplotlib for over seven years, creating data visualizations for a variety of US-based projects, from analyzing sales trends in New York City to visualizing climate data across California. One challenge I often face is when x-axis labels overlap or clutter the chart, especially when dealing with dates or categorical data.
Rotating x-axis labels in Matplotlib is a simple yet powerful technique to improve the readability of your charts. In this article, I will walk you through multiple methods to rotate x-axis labels in Python using Matplotlib.
Rotate X-Axis Labels in Python Matplotlib
When you plot data with many categories or long labels—like US states, city names, or months—Matplotlib’s default horizontal labels can overlap. This makes your chart hard to read and less professional.
Rotating the x-axis labels helps:
- Prevent label overlap
- Improve chart clarity
- Make your visualization more user-friendly
In my experience, even a small rotation of 45 degrees can turn a messy chart into a clean and insightful visualization.
Method 1: Use plt.xticks() to Rotate X-Axis Labels in Python
The simplest way to rotate x-axis labels is by using Matplotlib’s xticks() function with the rotation parameter.
Here’s a practical example using average monthly temperatures across US cities:
import matplotlib.pyplot as plt
# Sample data - average temperatures in Fahrenheit for US cities
cities = ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
avg_temps = [55.3, 65.4, 52.7, 69.8, 75.1]
plt.figure(figsize=(8,5))
plt.bar(cities, avg_temps, color='skyblue')
# Rotate x-axis labels by 45 degrees
plt.xticks(rotation=45)
plt.title('Average Monthly Temperatures in US Cities')
plt.ylabel('Temperature (°F)')
plt.tight_layout()
plt.show()You can see the output in the screenshot below.

I create a simple bar chart of average temperatures. By adding plt.xticks(rotation=45), I rotate the city names on the x-axis by 45 degrees. This prevents overlap and improves readability.
Method 2: Use ax.set_xticklabels() for More Control
If you are working with an Axes object (which I recommend for larger projects), you can rotate labels using set_xticklabels().
import matplotlib.pyplot as plt
states = ['California', 'Texas', 'Florida', 'New York', 'Illinois']
population = [39.5, 28.7, 21.5, 19.3, 12.7] # in millions
fig, ax = plt.subplots(figsize=(8,5))
ax.bar(states, population, color='coral')
# Rotate x-axis labels by 60 degrees with horizontal alignment
ax.set_xticklabels(states, rotation=60, ha='right')
ax.set_title('Population by State (Millions)')
ax.set_ylabel('Population')
plt.tight_layout()
plt.show()You can see the output in the screenshot below.

Here, I plot state populations. Using ax.set_xticklabels(), I rotate labels 60 degrees and align them to the right (ha=’right’) for a cleaner look. This method gives you more flexibility, such as controlling alignment and font properties.
Method 3: Use plt.setp() to Rotate Tick Labels
Sometimes, you want to modify multiple properties of tick labels simultaneously. I often use plt.setp() for this.
import matplotlib.pyplot as plt
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
sales = [250, 270, 300, 280, 320, 350, 370, 360, 340, 330, 310, 290] # in thousands USD
fig, ax = plt.subplots(figsize=(10,5))
ax.plot(months, sales, marker='o', linestyle='-', color='green')
# Rotate x-axis labels by 90 degrees
plt.setp(ax.get_xticklabels(), rotation=90, fontsize=10)
ax.set_title('Monthly Sales in US Retail Stores')
ax.set_ylabel('Sales (Thousands USD)')
plt.tight_layout()
plt.show()You can see the output in the screenshot below.

In this sales trend example, I rotate the month labels vertically (90 degrees) using plt.setp(). This is especially useful when labels are long or you want a vertical orientation for maximum clarity.
Method 4: Rotate Tick Labels in Subplots
When creating multiple subplots, rotating x-axis labels can be tricky. Here’s how I handle it efficiently:
import matplotlib.pyplot as plt
import numpy as np
categories = ['Electronics', 'Clothing', 'Home & Garden', 'Sports', 'Toys']
values1 = [120, 150, 100, 130, 90]
values2 = [110, 140, 95, 120, 85]
fig, axs = plt.subplots(1, 2, figsize=(12,5))
axs[0].bar(categories, values1, color='purple')
axs[0].set_title('Q1 Sales')
plt.setp(axs[0].get_xticklabels(), rotation=45, ha='right')
axs[1].bar(categories, values2, color='orange')
axs[1].set_title('Q2 Sales')
plt.setp(axs[1].get_xticklabels(), rotation=45, ha='right')
fig.suptitle('Quarterly Sales by Category in US Market')
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()I create two side-by-side bar charts for quarterly sales. Using plt.setp() on each subplot’s x-axis labels, I rotate them 45 degrees and right-align for a neat presentation.
Tips for Rotating X-Axis Labels in Python Matplotlib
- Adjust ha (horizontal alignment): Use ‘right’ or ‘left’ to align rotated labels properly.
- Use plt.tight_layout(): It automatically adjusts subplot parameters to give enough space for rotated labels.
- Set figure size: Larger figures make rotated labels easier to read.
- Combine rotation with font size: Smaller font sizes can help when labels are long, but rotation is limited.
Rotating x-axis labels is a small tweak that makes a huge difference in your Python Matplotlib visualizations. From US city names to monthly sales, this technique helps you communicate data clearly and professionally.
Try these methods in your next project, and you’ll see how much easier it is for your audience to understand your charts.
Other Python Matplotlib articles you may like:
- Make Matplotlib X-Axis Labels Vertical in Python
- Customize Matplotlib X-Axis Label Color and Size in Python
- Python Matplotlib X-Axis Label Spacing and Removing Labels
- Matplotlib X-Axis Labels in Subplots with Python

I am Bijay Kumar, a Microsoft MVP in SharePoint. Apart from SharePoint, I started working on Python, Machine learning, and artificial intelligence for the last 5 years. During this time I got expertise in various Python libraries also like Tkinter, Pandas, NumPy, Turtle, Django, Matplotlib, Tensorflow, Scipy, Scikit-Learn, etc… for various clients in the United States, Canada, the United Kingdom, Australia, New Zealand, etc. Check out my profile.