Matplotilb bar chart: diagonal tick labels

Marco picture Marco · Jul 24, 2013 · Viewed 19.4k times · Source

I am plotting a bar chart in python using matplotlib.pyplot. The chart will contain a large number of bars, and each bar has its own label. Thus, the labels overlap, and they are no more readable. I would like that the label are displayed diagonally so that they do not overlab, such as in this image.

This is my code:

import matplotlib.pyplot as plt
N =100
menMeans = range(N)
ind = range(N)  
ticks = ind 
fig = plt.figure()
ax = fig.add_subplot(111)
rects1 = ax.bar(ind, menMeans, align = 'center')
ax.set_xticks(ind)
ax.set_xticklabels( range(N) )
plt.show()

How can the labels be displayed diagonally?

Answer

Mark Amery picture Mark Amery · Jan 28, 2018

Instead of using set_xticks or set_xticklabels, which are both officially discouraged, you can just use the rotation parameter to xticks:

plt.xticks(rotation=45, ha="right")

This way you can specify the tick labels' rotation while letting matplotlib take care of their frequency/spacing for you. Note that the use of ha="right" to right-align the label text doesn't matter if your labels are all short (and you may want to remove it in that case), but is important if your labels are long and of variable length - it ensures that the end of the tick label is directly below the tick it's labelling, and prevents labels from being inconsistently spaced or even overlapping.

A full working example, based on the code in the question:

import matplotlib.pyplot as plt
N =100
menMeans = range(N)
ind = range(N)  
ticks = ind 
fig = plt.figure()
ax = fig.add_subplot(111)
rects1 = ax.bar(ind, menMeans, align = 'center')
plt.xticks(rotation=45, ha="right")
plt.show()

Output:

Graph with rotated labels