In a matplotlib figure, how can I make the font size for the tick labels using ax1.set_xticklabels()
smaller?
Further, how can one rotate it from horizontal to vertical?
There is a simpler way actually. I just found:
import matplotlib.pyplot as plt
# We prepare the plot
fig, ax = plt.subplots()
# We change the fontsize of minor ticks label
ax.tick_params(axis='both', which='major', labelsize=10)
ax.tick_params(axis='both', which='minor', labelsize=8)
This only answers to the size of label
part of your question though.
To specify both font size and rotation at the same time, try this:
plt.xticks(fontsize=14, rotation=90)
Please note that newer versions of MPL have a shortcut for this task. An example is shown in the other answer to this question: https://stackoverflow.com/a/11386056/42346
The code below is for illustrative purposes and may not necessarily be optimized.
import matplotlib.pyplot as plt
import numpy as np
def xticklabels_example():
fig = plt.figure()
x = np.arange(20)
y1 = np.cos(x)
y2 = (x**2)
y3 = (x**3)
yn = (y1,y2,y3)
COLORS = ('b','g','k')
for i,y in enumerate(yn):
ax = fig.add_subplot(len(yn),1,i+1)
ax.plot(x, y, ls='solid', color=COLORS[i])
if i != len(yn) - 1:
# all but last
ax.set_xticklabels( () )
else:
for tick in ax.xaxis.get_major_ticks():
tick.label.set_fontsize(14)
# specify integer or one of preset strings, e.g.
#tick.label.set_fontsize('x-small')
tick.label.set_rotation('vertical')
fig.suptitle('Matplotlib xticklabels Example')
plt.show()
if __name__ == '__main__':
xticklabels_example()
https://i.stack.imgur.com/lRp5U.png
plt.setp
. (Also, have a look at ax.tick_params
) For example, you can just do plt.setp(ax.get_xticklabels(), rotation='vertical', fontsize=14)
. Also, axes objects have an ax.is_last_row()
method which can be handy in cases like your example. Instead of if i != len...
, you can do if not ax.is_last_row()
. (Why it's a method, I have no clue... Matplotlib hates properties, apparently!)
is_last_row()
, thank you! I've used plt.setp
in the past, and wasn't necessarily sure it represented a more canonical way of customizing tick labels. You've removed that doubt, thanks. More broadly: your answers, especially in the matplotlib
tag, frequently leave me in awe. Keep up the great work.
plt.setp
is a "matlab-ism", and an explicit loop is probably much more pythonic. Being a matlab convert, myself, setp
feels natural, but to each their own. Either one is quite readable, i.m.o.
ax.tick_params(axis='x', labelsize=8)
get_ticklabels
not get_major_ticks
Alternatively, you can just do:
import matplotlib as mpl
label_size = 8
mpl.rcParams['xtick.labelsize'] = label_size
Another alternative
I have two plots side by side and would like to adjust tick labels separately.
The above solutions were close however they were not working out for me. I found my solution from this matplotlib page.
ax.xaxis.set_tick_params(labelsize=20)
This did the trick and was straight to the point. For my use case, it was the plot on the right that needed to be adjusted. For the plot on the left since I was creating new tick labels I was able to adjust the font in the same process as seting the labels.
ie
ax1.set_xticklabels(ax1_x, fontsize=15)
ax1.set_yticklabels(ax1_y, fontsize=15)
thus I used for the right plot,
ax2.xaxis.set_tick_params(labelsize=24)
ax2.yaxis.set_tick_params(labelsize=24)
A minor subtlety... I know... but I hope this helps someone :)
Bonus points if anyone knows how to adjust the font size of the order of magnitude label.
https://i.stack.imgur.com/oEaEn.png
ax.yaxis.offsetText.set_fontsize(18)
plt.tick_params(axis='both', which='minor', labelsize=12)
ax.xaxis.set_tick_params(labelsize=20)
In current versions of Matplotlib, you can do axis.set_xticklabels(labels, fontsize='small')
.
labels
too. It's better if we can change just the font size.
For smaller font, I use
ax1.set_xticklabels(xticklabels, fontsize=7)
and it works!
You can also change label display parameters like fontsize with a line like this:
zed = [tick.label.set_fontsize(14) for tick in ax.yaxis.get_major_ticks()]
The following worked for me:
ax2.xaxis.set_tick_params(labelsize=7)
ax2.yaxis.set_tick_params(labelsize=7)
The advantage of the above is you do not need to provide the array
of labels
and works with any data on the axes
.
Success story sharing
axis = 'x'
oraxis = 'y'
to modify just one of the axis