ChatGPT解决这个技术问题 Extra ChatGPT

Matplotlib make tick labels font size smaller

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?

Thanks for asking this question, I'm trying to solve this problem right now. I'm not strongly opinionated here, but looks like voters think the best answer is not the accepted one. What do you think?
did I properly read that there are at least 5 different ways to change the fontsize in matplotlib? :D

A
Autiwa

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.


Use axis = 'x' or axis = 'y' to modify just one of the axis
s
scottlittle

To specify both font size and rotation at the same time, try this:

plt.xticks(fontsize=14, rotation=90)

Note that this is used when working with MATLAB-like pyplot interface. In case of object-oriented interface tick_params() method of the axes object or set_tick_params() method of the axis object should be used (see other answers).
C
Community

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


Just as an aside: Instead of looping through the tick label objects, you can use 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!)
@Joe: this is my first time hearing about 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.
Thanks!! I appreciate the kind words, especially from you! Canonical is very relative, in this case. 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.
In new versions I found that you had to use the labelsize parameter: e.g. ax.tick_params(axis='x', labelsize=8)
Should be get_ticklabels not get_major_ticks
u
user2468932

Alternatively, you can just do:

import matplotlib as mpl
label_size = 8
mpl.rcParams['xtick.labelsize'] = label_size 

K
Kyle Swanson

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


Try this: ax.yaxis.offsetText.set_fontsize(18)
G
Georgy
plt.tick_params(axis='both', which='minor', labelsize=12)

This is the only answer that works if you want to change the fontsize without setting new labels.
@DavidStansby I don't believe this is true. I had this exact issue( Mentioned above) and was able to use an alternate method different from this solution. using ax.xaxis.set_tick_params(labelsize=20)
simplest answer, doesnt require reference to ax object
I'd argue that you'd want ax object..but to each their own
C
Christoph

In current versions of Matplotlib, you can do axis.set_xticklabels(labels, fontsize='small').


That forces you to specify the labels too. It's better if we can change just the font size.
L
Little Bobby Tables

For smaller font, I use

ax1.set_xticklabels(xticklabels, fontsize=7)

and it works!


how do you define xticklabels?
@mLstudent33 it's just a list of labels..could be anything really
A
ATX_Bigfoot

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

I think that using list comprehensions that have side effects is not the best practice. I'd suggest using a standard for loop instead.
R
Rohit Poudel

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.