如何设置图表标题和坐标轴标签的字体大小?

889

我正在使用Matplotlib创建一个图形,代码如下:

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')

我想指定图标题和轴标签的字体大小。我需要这三个元素有不同的字体大小,所以设置全局字体大小 (mpl.rcParams['font.size']=x) 不是我想要的。我该如何单独设置图标题和轴标签的字体大小?


1
我很好奇,所以我尝试添加了您的 mpl.rcParams ['font.size']=20 并尝试将值更改为 10 和 14。首先,我发现除非我将“mpl”更改为“plt”,否则会出现错误。这种更改消除了错误,但是代码行对我的标题或标签没有任何影响。确定这个语法正确吗? - TMWP
现在我从接受答案的评论中思考,问题可能是我的导入语句,但是如果我没有导入命令,为什么它不会抛出错误,这超出了我的理解。您在测试“mpl”命令时是否使用了其他导入行? - TMWP
@luc - 上面的链接已经失效了,我想。它显示“网站未找到”。你能否更新一下链接呢?谢谢。 - Scott85044
12个回答

1221

处理文本的函数(如labeltitle等)接受与matplotlib.text.Text相同的参数。对于字体大小,您可以使用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')

全局设置 titlelabel 的大小,可以使用mpl.rcParams中的axes.titlesizeaxes.labelsize。(来自该页面):

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

据我所知,没有办法分别设置xy轴标签的大小。

并且我发现axes.titlesize不会影响suptitle。 我想你需要手动设置它。


1
谢谢!有没有一种方法可以全局设置(suptitle、xlabel、ylabel)的显式值?我正在制作很多图表,只想指定一次... - vasek1
1
@vasek1:我以为你不想要全局设置:)。关于这一点,你需要使用mpl.rcParams。我已经编辑了我的回答。 - Avaris
35
如果您和我一样正在寻找更改标题字体大小的解决方案:plt.rcParams.update({'axes.titlesize': 'small'}) - tommy.carstensen
1
rcParams 链接中,除了 axes.titlesize 之外,还要使用 figure.titlesize - Mad Physicist
1
@AlexanderMcFarlane。我运行了 python -c 'import matplotlib as mpl; print(mpl.__version__); print("figure.titlesize" in mpl.rcParams.keys())'。结果是 1.5.1True。1)您使用的matplotlib版本是什么?Python的版本是什么?2)这可能是一个错误,因为出于某种原因它在Py2中接受str但不接受unicode吗? - Mad Physicist
显示剩余5条评论

150

您也可以通过rcParams字典全局执行此操作:

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)

10
除了 'x-large' 外还有哪些尺寸? - Martin Thoma
33
‘xx-small’,‘x-small’,‘small’,‘medium’,‘large’,‘x-large’,‘xx-large’ 分别表示非常小、特别小、小、中等、大、特别大、非常大的字体大小。请参阅 https://matplotlib.org/api/font_manager_api.html#matplotlib.font_manager.FontProperties.set_size - tsando
2
使用 pylab.rcParams.keys() 命令可以查看参数的完整列表。 - Nirmal
谢谢。有没有一种方法可以全局设置标题和轴标签的显式数字大小,而不是总是执行ax.set_title('some title', fontsize=15)ax.set_xlabel('some xlabel', fontsize=12)?似乎rcParams只接受字符串。 - timgeb
10
您也可以使用数字... 'axes.labelsize': 32, - mimoralea
除了 axes.titlesize 之外,您还可以通过 {'figure.titlesize':'medium'} 来调整图表标题的大小。可以使用 plt.suptitle("SUP", y=0.95) 方法实现,其中 y 参数非常有用。 - PatrickT

140

如果您更习惯于使用ax对象进行绘图,您可能会发现ax.xaxis.label.set_size()更容易记住,或者至少在ipython终端中通过tab查找更容易。似乎需要重绘操作才能看到效果。例如:

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

我不知道有类似的方法可以在创建后设置suptitle大小。


2
fig.suptitle('test title', fontsize = 20) 看起来是有效的。ax.set_xlabel('xlabel', fontsize = 20) 也可以,这种情况下我们可以省略 ax.xaxis.label.set_size(20) - T_T
1
@T_T 这是真的,这些形式与Avaris上面的答案类似。我会为了完整性而添加它们。当我与_ipython_绘图进行交互并且我想快速视觉评估各种字体大小时,我仍然会使用ax.xaxis.label.set_size() - SpinUp __ A Davis
你知道使用ax对象和figure对象是否有任何(隐藏的)区别,还是两者完全等效?为什么某些功能有不同的接口?(例如plt.xlabel() vs. ax.set_xlabel()) - normanius
1
@normanius,如果您指的是以上示例中的ax和fig,则它们是非常不同的对象--fig是整个图形,可能包含多个轴。因此,fig和ax具有不同的属性。就pyplot类型调用和对象调用之间的区别(例如plt.xlabel()ax.set_xlabel()),它们是等效的,并且需要注意的是 plt.* 函数作用于当前的轴/图形。因此,如果您设置了一个具有多个轴的图形,您可能需要使用显式调用,如 ax1.set_xlabel() 来避免混淆。 - SpinUp __ A Davis

56

为了仅修改标题的字体(而不是轴线的字体),我使用了以下代码:

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

fontdict接受来自matplotlib.text.Text的所有kwargs。


我正在运行Python 3.8.5,不需要使用fontdict。它确实可以工作,但您也可以使用以下代码: ax.set_title("My Title", fontsize=18, fontwieght="medium")。这也适用于ax2.set_xticklabels等。 - B McMinn

47
根据官方指南,不再建议使用pylab。应直接使用matplotlib.pyplotrcParams全局设置字体大小应该这样做:
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)

可以使用{{恢复默认值}}。

plt.rcParams.update(plt.rcParamsDefault)

你也可以通过在matplotlib配置目录stylelib目录中创建一个样式表来实现此操作(你可以通过matplotlib.get_configdir()获取你的配置目录)。样式表的格式为

axes.labelsize: 16
axes.titlesize: 16
如果您在路径 /path/to/mpl_configdir/stylelib/mystyle.mplstyle 中有一个样式表,那么您可以通过以下方式使用它:
plt.style.use('mystyle')

# or, for a single section

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

您还可以创建(或修改)一个matplotlibrc文件,其格式与其他Matplotlib配置文件相同。

axes.labelsize = 16
axes.titlesize = 16
根据您修改的matplotlibrc文件不同,这些更改将仅用于当前工作目录,对于所有没有matplotlibrc文件的工作目录,或者对于所有没有matplotlibrc文件且没有指定其他matplotlibrc文件的工作目录。有关详细信息,请参见自定义matplotlib页面的此部分。 可以通过plt.rcParams.keys()检索完整的rcParams密钥列表,但是要调整字体大小,您可以(引用自此处)使用特定的参数。
  • axes.labelsize - x轴和y轴标签的字体大小
  • axes.titlesize - 坐标轴标题的字体大小
  • figure.titlesize - 图表标题的字体大小(Figure.suptitle()
  • xtick.labelsize - 刻度标签的字体大小
  • ytick.labelsize - 刻度标签的字体大小
  • legend.fontsize - 图例的字体大小(plt.legend()fig.legend()
  • legend.title_fontsize - 图例标题的字体大小,None将其设置为与默认轴相同。请参见this answer以获取使用示例。

所有这些都接受字符串大小{'xx-small','x-small','smaller','small','medium','large','larger','x-large','xxlarge'}或以pt为单位的float。 字符串大小相对于由以下指定的默认字体大小定义

  • font.size - 文本的默认字体大小,以点为单位。标准值为10pt

此外,可以指定字体的重量(仅适用于默认值)

  • font.weight - text.Text使用的字体的默认重量。接受{100, 200, 300, 400, 500, 600, 700, 800, 900}'normal'(400),'bold'(700),'lighter''bolder'相对于当前重量)。

23

如果您没有显式地创建图形和坐标轴对象,您可以在使用fontdict参数创建标题时设置标题字体大小。

当您使用fontsize参数创建x轴和y轴标签时,您可以分别设置它们的字体大小。

例如:

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!

同样适用于seaborn和pandas绘图(当Matplotlib是后端时)!


16

其他人已经提供了如何更改标题大小的答案,但是对于轴刻度标签大小,您也可以使用set_tick_params方法。

例如,要使x轴刻度标签大小变小:

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

或者,使 y 轴刻度标签变大:

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

您还可以将 labelsize 输入为浮点数,或以下任何字符串选项之一:'xx-small'、'x-small'、'small'、'medium'、'large'、'x-large' 或 'xx-large'。


1
我在这里寻找的是什么。谢谢。 - arilwan

3

在调用 set_ylabel() 之前,请先将 right_ax 放置于前面。

ax.right_ax.set_ylabel('AB 刻度')


3

改变字体大小的另一种解决方案是改变填充。当Python保存您的PNG文件时,您可以使用打开的对话框更改布局。此时可以调整轴之间的间距或填充。


0
所有"标签"调用,如`suptitle()`、`set_xlabel()`/`plt.xlabel`、`set_title`等,都返回一个`matplotlib.text.Text`实例,该实例定义了一个`set_size()`方法来调整字体大小。访问这些实例的方式因所需内容而异;通过`fig._suptitle`可以访问`suptitle`,而通过`ax.xaxis.label`可以访问`xlabel`。
from matplotlib import pyplot as plt

fig, ax = plt.subplots()
ax.plot(range(2))
ax.set_title('Subplot title')   # Text(0.5, 1.0, 'Subplot title')
fig.suptitle('Figure title')    # Text(0.5, 0.98, 'Figure title')
ax.set_xlabel('xlabel')         # Text(0.5, 0, 'xlabel')
ax.set_ylabel('ylabel')         # Text(0, 0.5, 'ylabel')

fig._suptitle.set_size(25)      # change figure title size
fig.subplots_adjust(top=0.8)    # make space between subplots and figure

ax.xaxis.label.set_size(15)     # change xlabel size
ax.yaxis.label.set_size(15)     # change ylabel size
ax.title.set_size(15)           # change subplot title size

figure


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,