ChatGPT解决这个技术问题 Extra ChatGPT

How do I set the figure title and axes labels font size in Matplotlib?

I am creating a figure in Matplotlib like this:

from matplotlib import pyplot as plt

fig = plt.figure()
plt.plot(data)
fig.suptitle('test title')
plt.xlabel('xlabel')
plt.ylabel('ylabel')
fig.savefig('test.jpg')

I want to specify font sizes for the figure title and the axis labels. I need all three to be different font sizes, so setting a global font size (mpl.rcParams['font.size']=x) is not what I want. How do I set font sizes for the figure title and the axis labels individually?

I was curious so I tried adding your mpl.rcParams['font.size'] = 20 and tried changing values to 10 and 14. First I found that I got errors unless I changed mpl to plt. That change cleared the error but then the line of code had no effect on my titles or labels. Sure this syntax is right?
now I am thinking from the comments on the accepted answer that the problem might be my import statement though why it does not throw an error if I did not import the command is beyond me. Is there another import line you used when testing the mpl command?
@luc - Above link has expired I think. It says - "Site not found". Could you please update the link, please?

N
Neuron

Functions dealing with text like label, title, etc. accept parameters same as matplotlib.text.Text. For the font size you can use size/fontsize:

from matplotlib import pyplot as plt    

fig = plt.figure()
plt.plot(data)
fig.suptitle('test title', fontsize=20)
plt.xlabel('xlabel', fontsize=18)
plt.ylabel('ylabel', fontsize=16)
fig.savefig('test.jpg')

For globally setting title and label sizes, mpl.rcParams contains axes.titlesize and axes.labelsize. (From the page):

axes.titlesize      : large   # fontsize of the axes title
axes.labelsize      : medium  # fontsize of the x any y labels

(As far as I can see, there is no way to set x and y label sizes separately.)

And I see that axes.titlesize does not affect suptitle. I guess, you need to set that manually.


thanks! is there a way to set that globally but explicitly for (suptitle, xlabel, ylabel)? I am making a lot of charts and just want to specify it once...
@vasek1: I thought you didn't want global setting :). For that you need mpl.rcParams. I've edited my answer.
To anyone else like myself looking for the solution to change the titlesize: plt.rcParams.update({'axes.titlesize': 'small'})
From the rcParams link, use figure.titlesize in addition to axes.titlesize.
@AlexanderMcFarlane. I ran python -c 'import matplotlib as mpl; print(mpl.__version__); print("figure.titlesize" in mpl.rcParams.keys())'. Result is 1.5.1, True. 1) What version of matplotlib are you using? What version of Python? 2) Could it be a bug where for some reason it accepts str but not unicode in Py2?
t
tsando

You can also do this globally via a rcParams dictionary:

import matplotlib.pylab as pylab
params = {'legend.fontsize': 'x-large',
          'figure.figsize': (15, 5),
         'axes.labelsize': 'x-large',
         'axes.titlesize':'x-large',
         'xtick.labelsize':'x-large',
         'ytick.labelsize':'x-large'}
pylab.rcParams.update(params)

What are other sizes besides 'x-large'?
‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, ‘x-large’, ‘xx-large’. See matplotlib.org/api/…
Use pylab.rcParams.keys() to see the full list of parameters.
Thanks. Is there a way to globally set explicit numeric sizes for the title and the axis-labels instead of always doing ax.set_title('some title', fontsize=15), ax.set_xlabel('some xlabel', fontsize=12)? It seems like rcParams only accepts strings.
You can also use numbers... 'axes.labelsize': 32,
S
SpinUp

If you're more used to using ax objects to do your plotting, you might find the ax.xaxis.label.set_size() easier to remember, or at least easier to find using tab in an ipython terminal. It seems to need a redraw operation after to see the effect. For example:

import matplotlib.pyplot as plt

# set up a plot with dummy data
fig, ax = plt.subplots()
x = [0, 1, 2]
y = [0, 3, 9]
ax.plot(x,y)

# title and labels, setting initial sizes
fig.suptitle('test title', fontsize=12)
ax.set_xlabel('xlabel', fontsize=10)
ax.set_ylabel('ylabel', fontsize='medium')   # relative to plt.rcParams['font.size']

# setting label sizes after creation
ax.xaxis.label.set_size(20)
plt.draw()

I don't know of a similar way to set the suptitle size after it's created.


fig.suptitle('test title', fontsize = 20) seems to work. ax.set_xlabel('xlabel', fontsize = 20)' also works, in which case we can do away with ax.xaxis.label.set_size(20)`.
@T_T That's true, and these forms are similar to Avaris' answer above. I'll add them for completeness. I still find a use for ax.xaxis.label.set_size() when I'm working interactively with an ipython plot and I want to do a quick visual assessment of a variety of font sizes.
Do you know if there's any (hidden) difference between using ax objects and figure objects, or are both perfectly equivalent? Why are there different interfaces for some of the features? (plt.xlabel() vs. ax.set_xlabel())
@normanius, if you mean ax and fig in the above example, they are quite different objects -- fig is the overall figure, which may contain several axes. So fig and ax have different properties. In terms of the difference between the pyplot type calls and object calls (e.g. plt.xlabel() vs. ax.set_xlabel() as you say), they are equivalent, with the caveat that the plt.* functions work on the current axis/figure. So it you set up a figure with multiple axes, you'll probably want to use explicit calls like ax1.set_xlabel() to avoid confusion.
E
Elazar

To only modify the title's font (and not the font of the axis) I used this:

import matplotlib.pyplot as plt
fig = plt.Figure()
ax = fig.add_subplot(111)
ax.set_title('My Title', fontdict={'fontsize': 8, 'fontweight': 'medium'})

The fontdict accepts all kwargs from matplotlib.text.Text.


I'm running Python 3.8.5 and I don't need to use fontdict. It does work, but you can also use: ax.set_title("My Title", fontsize=18, fontwieght="medium"). This also works on ax2.set_xticklabels etc.
W
William Miller

Per the official guide, use of pylab is no longer recommended. matplotlib.pyplot should be used directly instead.

Globally setting font sizes via rcParams should be done with

import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 16
plt.rcParams['axes.titlesize'] = 16

# or

params = {'axes.labelsize': 16,
          'axes.titlesize': 16}
plt.rcParams.update(params)

# or

import matplotlib as mpl
mpl.rc('axes', labelsize=16, titlesize=16)

# or 

axes = {'labelsize': 16,
        'titlesize': 16}
mpl.rc('axes', **axes)

The defaults can be restored using

plt.rcParams.update(plt.rcParamsDefault)

You can also do this by creating a style sheet in the stylelib directory under the matplotlib configuration directory (you can get your configuration directory from matplotlib.get_configdir()). The style sheet format is

axes.labelsize: 16
axes.titlesize: 16

If you have a style sheet at /path/to/mpl_configdir/stylelib/mystyle.mplstyle then you can use it via

plt.style.use('mystyle')

# or, for a single section

with plt.style.context('mystyle'):
    # ...

You can also create (or modify) a matplotlibrc file which shares the format

axes.labelsize = 16
axes.titlesize = 16

Depending on which matplotlibrc file you modify these changes will be used for only the current working directory, for all working directories which do not have a matplotlibrc file, or for all working directories which do not have a matplotlibrc file and where no other matplotlibrc file has been specified. See this section of the customizing matplotlib page for more details.

A complete list of the rcParams keys can be retrieved via plt.rcParams.keys(), but for adjusting font sizes you have (italics quoted from here)

axes.labelsize - Fontsize of the x and y labels

axes.titlesize - Fontsize of the axes title

figure.titlesize - Size of the figure title (Figure.suptitle())

xtick.labelsize - Fontsize of the tick labels

ytick.labelsize - Fontsize of the tick labels

legend.fontsize - Fontsize for legends (plt.legend(), fig.legend())

legend.title_fontsize - Fontsize for legend titles, None sets to the same as the default axes. See this answer for usage example.

all of which accept string sizes {'xx-small', 'x-small', 'smaller', 'small', 'medium', 'large', 'larger', 'x-large', 'xxlarge'} or a float in pt. The string sizes are defined relative to the default font size which is specified by

font.size - the default font size for text, given in pts. 10 pt is the standard value

Additionally, the weight can be specified (though only for the default it appears) by

font.weight - The default weight of the font used by text.Text. Accepts {100, 200, 300, 400, 500, 600, 700, 800, 900} or 'normal' (400), 'bold' (700), 'lighter', and 'bolder' (relative with respect to current weight).


j
jeffhale

If you aren't explicitly creating figure and axis objects you can set the title fontsize when you create the title with the fontdict argument.

You can set and the x and y label fontsizes separately when you create the x and y labels with the fontsize argument.

For example:

plt.title('Car Prices are Increasing', fontdict={'fontsize':20})
plt.xlabel('Year', fontsize=18)
plt.ylabel('Price', fontsize=16)

Works with seaborn and pandas plotting (when Matplotlib is the backend), too!


e
etotheipi

Others have provided answers for how to change the title size, but as for the axes tick label size, you can also use the set_tick_params method.

E.g., to make the x-axis tick label size small:

ax.xaxis.set_tick_params(labelsize='small')

or, to make the y-axis tick label large:

ax.yaxis.set_tick_params(labelsize='large')

You can also enter the labelsize as a float, or any of the following string options: 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', or 'xx-large'.


This is for the tick label, not the axis label though.
Yes, you are correct in regard to the OP. However, other answers also mentioned the tick label sizes, and I thought it would be useful to users to know about this method, as well.
I did upvote it for that same reason :) But I think since the answer specifies "axes label size", I think it should be corrected to "tick label size"
Good point. I made the edits. And, thank you for the upvote.
C
Cody Gray

An alternative solution to changing the font size is to change the padding. When Python saves your PNG, you can change the layout using the dialogue box that opens. The spacing between the axes, padding if you like can be altered at this stage.


T
Trenton McKinney

Place right_ax before set_ylabel()

ax.right_ax.set_ylabel('AB scale')


T
Tejas PV

libraries

import numpy as np

import matplotlib.pyplot as plt

create dataset

height = [3, 12, 5, 18, 45]

bars = ('A', 'B', 'C', 'D', 'E')

x_pos = np.arange(len(bars))

Create bars and choose color

plt.bar(x_pos, height, color = (0.5,0.1,0.5,0.6))

Add title and axis names

plt.title('My title')

plt.xlabel('categories')

plt.ylabel('values')

Create names on the x axis

plt.xticks(x_pos, bars)

Show plot

plt.show()


Welcome Tejas! Please consider formatting your answer to make it easier to read. Formatting some parts in code would be a good start.
C
Community

7 (best solution)

 from numpy import*
 import matplotlib.pyplot as plt
 X = linspace(-pi, pi, 1000)

class Crtaj:

    def nacrtaj(self,x,y):
         self.x=x
         self.y=y
         return plt.plot (x,y,"om")

def oznaci(self):
    return plt.xlabel("x-os"), plt.ylabel("y-os"), plt.grid(b=True)

6 (slightly worse solution)

from numpy import*
M = array([[3,2,3],[1,2,6]])
class AriSred(object):
    def __init__(self,m):
    self.m=m
    
def srednja(self):
    redovi = len(M)
    stupci = len (M[0])
    lista=[]
    a=0
    suma=0
    while a<stupci:
        for i in range (0,redovi):
            suma=suma+ M[i,a]
        lista.append(suma)
        a=a+1
        suma=0
    b=array(lista) 
    b=b/redovi
    return b



OBJ = AriSred(M)
sr = OBJ.srednja()

While this code may provide a solution to OP's problem, it is highly recommended that you provide additional context regarding why and/or how this code answers the question. Code only answers typically become useless in the long-run because future viewers experiencing similar problems cannot understand the reasoning behind the solution.
better use english.