如何在Matplotlib中设置图形标题和轴标签的字体大小?


530

我正在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

现在,我从接受的答案的评论中考虑,问题可能出在我的import语句上,尽管如果我不导入命令,为什么它不会引发错误,这超出了我的范围。测试mpl命令时是否使用了另一条导入行?
TMWP

Answers:


772

对付像文本功能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。我想,您需要手动设置。


谢谢!有没有一种方法可以在全局范围内但显式设置(字幕,xlabel,ylabel)呢?我正在制作很多图表,只想指定一次即可...
vasek1 2012年

@ vasek1:我以为你不想全局设置:)。为此,您需要mpl.rcParams。我已经编辑了答案。
阿瓦里斯

16
对于像我这样的其他人,寻找更改标题大小的解决方案:plt.rcParams.update({'axes.titlesize': 'small'})
tommy.carstensen 2015年

rcParams链接中,figure.titlesize除了,还使用axes.titlesize
疯狂物理学家,2015年

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)可能是由于某种原因strunicode在Py2中不接受的bug?
疯狂物理学家,2016年

90

您也可以通过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)

5
除了'x-large'什么尺寸?
马丁·托玛

15
“ xx小”,“ x小”,“小”,“中”,“大”,“ x大”,“ xx大”。见matplotlib.org/api/...
tsando

使用pylab.rcParams.keys()看参数的完整列表。
Nirmal

谢谢。有没有一种方法,以全局设置明确的数字尺寸标题和轴的标签,而不是总在做ax.set_title('some title', fontsize=15)ax.set_xlabel('some xlabel', fontsize=12)?似乎rcParams只接受字符串。
timgeb

4
您也可以使用数字...'axes.labelsize': 32,
mimoralea

65

如果您更习惯于使用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()

我不知道创建字幕后设置字幕大小的类似方法。


fig.suptitle('test title', fontsize = 20)似乎有效。ax.set_xlabel('xlabel', fontsize = 20)' also works, in which case we can do away with ax.xaxis.label.set_size(20)`。
T_T

1
@T_T是的,这些形式类似于上面的Avaris回答。为了完整起见,我将添加它们。ax.xaxis.label.set_size()当我与ipython图形进行交互工作时,我仍然可以找到一种用途,并且我想对各种字体大小进行快速的视觉评估。
6

您是否知道使用斧头对象和图形对象之间是否有任何(隐藏的)区别,或者两者完全相同?为什么某些功能有不同的接口?(plt.xlabel()vs.ax.set_xlabel())
normanius

1
@normanius,如果您在上面的示例中表示斧头和无花果,则它们是完全不同的对象-图是整体图,可能包含多个轴。因此无花果和斧头具有不同的属性。就pyplot类型调用和对象调用(例如,您所说的plt.xlabel()vs ax.set_xlabel())之间的区别而言 ,它们是等效的,但要注意的是,plt.*函数在当前轴/图形上起作用。因此,如果您设置了一个具有多个轴的图形,则可能需要使用显式调用ax1.set_xlabel()以避免混淆。
21:48旋转

19

为了只修改标题的字体(而不是轴的字体),我使用了以下命令:

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中的所有kwarg 。


8

根据官方指南pylab不再建议使用。matplotlib.pyplot应该直接使用。

在全球范围内设置字体大小通过rcParams应该做

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配置目录下的目录中创建样式表来完成此操作(您可以从中获取配置目录)。样式表格式为stylelibmatplotlib.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文件共享格式

axes.labelsize = 16
axes.titlesize = 16

取决于您修改的matplotlibrc文件,这些更改将仅用于当前工作目录,具有matplotlibrc文件的所有工作目录,或具有matplotlibrc文件且没有其他matplotlibrc文件的所有工作目录。被指定。看到本节更多详细信息,定制matplotlib页面的。

rcParams可以通过找到完整的键列表plt.rcParams.keys(),但是要调整字体大小,请使用(此处引号为斜体)

  • axes.labelsize- x和y标签的字体大小
  • axes.titlesize- 轴标题的字体大小
  • figure.titlesize- 图形标题的大小(Figure.suptitle()
  • xtick.labelsize- 刻度标签的字体大小
  • ytick.labelsize- 刻度标签的字体大小
  • legend.fontsize-图例的字体大小(plt.legend()fig.legend()
  • legend.title_fontsize-图例标题的字体大小,None设置为与默认轴相同。有关用法示例,请参见此答案

所有这些都接受字符串大小{'xx-small', 'x-small', 'smaller', 'small', 'medium', 'large', 'larger', 'x-large', 'xxlarge'}floatin pt。字符串大小是相对于默认字体大小定义的,该默认大小由

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

此外,可以通过以下方式指定重量(尽管仅用于默认值)

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

2

更改字体大小的另一种方法是更改​​填充。当Python保存您的PNG时,您可以使用打开的对话框更改布局。轴之间的间距,如果需要,可以更改内边距。



-3

7(最佳解决方案)

 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(较差的解决方案)

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

2
尽管此代码可以为OP的问题提供解决方案,但强烈建议您提供有关此代码为何和/或如何回答问题的其他上下文。从长远来看,只有代码的答案通常变得毫无用处,因为遇到类似问题的未来观看者将无法理解解决方案背后的原因。
E. Zeytinci
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.