如何在matplotlib绘图中更改字体大小

902
如何更改 matplotlib 图表上所有元素(刻度、标签、标题)的字体大小?
我知道如何更改刻度标签的大小,可以使用以下方式:
import matplotlib 
matplotlib.rc('xtick', labelsize=20) 
matplotlib.rc('ytick', labelsize=20) 

但是如何更改其余部分?

16个回答

1112
matplotlib文档中,
font = {'family' : 'normal',
        'weight' : 'bold',
        'size'   : 22}

matplotlib.rc('font', **font)

这将所有项目的字体设置为kwargs对象指定的字体font
或者,您还可以使用rcParams update方法,如this answer中建议的那样。
matplotlib.rcParams.update({'font.size': 22})

或者

import matplotlib.pyplot as plt
plt.rcParams.update({'font.size': 22})

您可以在自定义matplotlib页面上找到所有可用属性的完整列表。

12
很好,除了它会覆盖沿途找到的任何字号属性。 - yota
4
我在哪里可以找到更多关于“家庭”、“重量”等元素的选项? - haccks
143
因为很多人都是从 import matplotlib.pyplot as plt 开始的,所以你可能需要指出 pyplot 也有 rc。你可以使用 plt.rc(... 而不必更改导入的内容。 - LondonRob
65
对于急躁的人:默认字体大小是10,就像第二个链接中的一样。 - FvD
8
@user32882 - 不是永久性的,它不会保存到磁盘,但我认为它会改变在同一段代码生成的后续图表,除非原始值被存储和恢复,这并不总是方便的。您可以执行类似于for label in (ax.get_xticklabels() + ax.get_yticklabels()): label.set_fontsize(22)的操作来影响单个图中的文本大小。 - Terry Brown
显示剩余11条评论

614

如果你像我一样是个控制狂,你可能想要明确地设置所有的字体大小:

import matplotlib.pyplot as plt

SMALL_SIZE = 8
MEDIUM_SIZE = 10
BIGGER_SIZE = 12

plt.rc('font', size=SMALL_SIZE)          # controls default text sizes
plt.rc('axes', titlesize=SMALL_SIZE)     # fontsize of the axes title
plt.rc('axes', labelsize=MEDIUM_SIZE)    # fontsize of the x and y labels
plt.rc('xtick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
plt.rc('ytick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
plt.rc('legend', fontsize=SMALL_SIZE)    # legend fontsize
plt.rc('figure', titlesize=BIGGER_SIZE)  # fontsize of the figure title

请注意,您还可以通过在matplotlib上调用rc方法来设置大小:

import matplotlib

SMALL_SIZE = 8
matplotlib.rc('font', size=SMALL_SIZE)
matplotlib.rc('axes', titlesize=SMALL_SIZE)

# and so on ...

15
我尝试了许多答案,这个在Jupyter笔记本中看起来最好。只需将上面的代码块复制到顶部并自定义三个字体大小常量即可。 - fviktor
21
对我来说,标题大小没有起作用。我使用了:plt.rc('axes', titlesize=BIGGER_SIZE) - Fernando Irarrázaval G
2
我认为您可以将同一对象的所有设置合并到一行中。例如,plt.rc('axes', titlesize=SMALL_SIZE, labelsize=MEDIUM_SIZE) - BallpointBen
我尝试了一些答案。这个是最好的! - undefined

268

如果你想改变已经创建的某个具体图表的字体大小,请尝试以下方法:

import matplotlib.pyplot as plt

ax = plt.subplot(111, xlabel='x', ylabel='y', title='title')
for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] +
             ax.get_xticklabels() + ax.get_yticklabels()):
    item.set_fontsize(20)

2
我的目的是使x-y标签、刻度和标题的字体大小不同。这个修改后的版本对我非常有效。 - Ébe Isaac
11
要同时获取图例和标签文本,可以使用ax.legend().get_texts()。在Matplotlib 1.4上进行了测试。 - James S.
如果绘图时没有定义坐标轴,则可能需要一个 ax=plt.gca() - dylnan
5
最好使用ax.get_legend().get_texts(),因为ax.legend()会在返回ax.get_legend()的值之上重新绘制整个图例,并使用默认参数。 - Guimoute

230
matplotlib.rcParams.update({'font.size': 22})

2
在我的情况下,这个解决方案只有在我创建第一个图后,按照建议进行“更新”,才能导致新图的字体大小更新。也许第一个图是必要的,以初始化rcParams... - Songio

85

这篇答案适用于任何想要更改所有字体(包括图例)以及任何想要为每个元素使用不同字体和大小的人。它不使用rc(在我看来似乎无法工作)。可能有点繁琐,但我个人无法掌握其他方法。

我已经找到了一种比我的原始答案更简洁的方法。它允许您系统中的任何字体,甚至是.otf字体。要为每个元素设置单独的字体,只需编写更多的font_pathfont_prop变量即可。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager
import matplotlib.ticker
# Workaround for Matplotlib 2.0.0 log axes bug https://github.com/matplotlib/matplotlib/issues/8017 :
# matplotlib.ticker._mathdefault = lambda x: '\\mathdefault{%s}'%x 

# Set the font properties (can use more variables for more fonts)
font_path = 'C:\Windows\Fonts\AGaramondPro-Regular.otf'
font_prop = font_manager.FontProperties(fname=font_path, size=14)

ax = plt.subplot() # Defines ax variable by creating an empty plot

# Define the data to be plotted
x = np.linspace(0, 10)
y = x + np.random.normal(x)
plt.plot(x, y, 'b+', label='Data points')

for label in (ax.get_xticklabels() + ax.get_yticklabels()):
    label.set_fontproperties(font_prop)
    label.set_fontsize(13) # Size here overrides font_prop

plt.title("Exponentially decaying oscillations", fontproperties=font_prop,
          size=16, verticalalignment='bottom') # Size here overrides font_prop
plt.xlabel("Time", fontproperties=font_prop)
plt.ylabel("Amplitude", fontproperties=font_prop)
plt.text(0, 0, "Misc text", fontproperties=font_prop)

lgd = plt.legend(loc='lower right', prop=font_prop) # NB different 'prop' argument for legend
lgd.set_title("Legend", prop=font_prop)

plt.show()

原始答案

这基本上将ryggyr在此处的答案与SO上的其他答案结合起来。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager

# Set the font dictionaries (for plot title and axis titles)
title_font = {'fontname':'Arial', 'size':'16', 'color':'black', 'weight':'normal',
              'verticalalignment':'bottom'} # Bottom vertical alignment for more space
axis_font = {'fontname':'Arial', 'size':'14'}

# Set the font properties (for use in legend)   
font_path = 'C:\Windows\Fonts\Arial.ttf'
font_prop = font_manager.FontProperties(fname=font_path, size=14)

ax = plt.subplot() # Defines ax variable by creating an empty plot

# Set the tick labels font
for label in (ax.get_xticklabels() + ax.get_yticklabels()):
    label.set_fontname('Arial')
    label.set_fontsize(13)

x = np.linspace(0, 10)
y = x + np.random.normal(x) # Just simulates some data

plt.plot(x, y, 'b+', label='Data points')
plt.xlabel("x axis", **axis_font)
plt.ylabel("y axis", **axis_font)
plt.title("Misc graph", **title_font)
plt.legend(loc='lower right', prop=font_prop, numpoints=1)
plt.text(0, 0, "Misc text", **title_font)
plt.show()

通过拥有多个字体词典,您可以选择不同的字体/大小/重量/颜色来为各种标题进行设置,选择刻度标签的字体,并独立选择图例的字体。

69

这里提供一个完全不同的做法,以惊人的效果改变字体大小:

改变图像尺寸

我通常会使用类似以下的代码:

import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(4,3))
ax = fig.add_subplot(111)
x = np.linspace(0,6.28,21)
ax.plot(x, np.sin(x), '-^', label="1 Hz")
ax.set_title("Oscillator Output")
ax.set_xlabel("Time (s)")
ax.set_ylabel("Output (V)")
ax.grid(True)
ax.legend(loc=1)
fig.savefig('Basic.png', dpi=300)

图形尺寸越小,字体相对于绘图区域就越大,标记也会放大。请注意我还设置了每英寸点数dpi。我从AMTA(美国建模教师协会)论坛的一个帖子中学到了这些知识。

来自上述代码的示例:输入图像描述


11
为避免轴标签被裁剪,在保存图像时使用bbox_inches参数:`fig.savefig('Basic.png', bbox_inches="tight")` - Paw
如果我没有保存这个图形呢?我在Jupyter Notebook中绘制,结果轴标签被截断了。 - Zythyr
谢谢!指出dpi设置对我非常有帮助,使我能够准备可打印版本的图表,而无需调整所有线条大小、字体大小等。 - ybull
1
为了防止标签被截断,就像@Zythyr所建议的那样,在笔记本中也可以使用plt.tight_layout() - Ramon Crehuet
1
@Zythyr 你可以在 plt.figure() 的调用中使用 dpi=XXX 参数:plt.figure(figsize=(4,3), dpi=300),以达到不保存文件的相同效果。 - dnalow
非常感谢您在这里发布了这个答案!它解决了我尝试解决的“字体大小”增加的根本问题。 - LunkRat

50

您可以使用 plt.rcParams["font.size"] 设置 matplotlib 中的文本字体大小,也可以使用 plt.rcParams["font.family"] 设置 matplotlib 中的字体族。试试这个例子:

import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')

label = [1,2,3,4,5,6,7,8]
x = [0.001906,0.000571308,0.0020305,0.0037422,0.0047095,0.000846667,0.000819,0.000907]
y = [0.2943301,0.047778308,0.048003167,0.1770876,0.532489833,0.024611333,0.157498667,0.0272095]


plt.ylabel('eigen centrality')
plt.xlabel('betweenness centrality')
plt.text(0.001906, 0.2943301, '1 ', ha='right', va='center')
plt.text(0.000571308, 0.047778308, '2 ', ha='right', va='center')
plt.text(0.0020305, 0.048003167, '3 ', ha='right', va='center')
plt.text(0.0037422, 0.1770876, '4 ', ha='right', va='center')
plt.text(0.0047095, 0.532489833, '5 ', ha='right', va='center')
plt.text(0.000846667, 0.024611333, '6 ', ha='right', va='center')
plt.text(0.000819, 0.157498667, '7 ', ha='right', va='center')
plt.text(0.000907, 0.0272095, '8 ', ha='right', va='center')
plt.rcParams["font.family"] = "Times New Roman"
plt.rcParams["font.size"] = "50"
plt.plot(x, y, 'o', color='blue')

请看输出:


49

使用plt.tick_params(labelsize=14)


6
感谢您提供的代码片段,它可能会提供一些有限的、即时的帮助。一个适当的解释将会大大提高它的长期价值(https://meta.stackexchange.com/q/114762/206345),描述为什么这是解决问题的好方法,并且使它对未来有类似问题的读者更有用。请编辑您的答案,添加一些解释,包括您所做出的假设。 - sepehr
4
这是否只是改变勾号字体大小? - JiK
传说中有类似的东西吗? - nightcrawler

37

这是我在Jupyter Notebook中通常使用的内容:

# Jupyter Notebook settings

from IPython.core.display import display, HTML
display(HTML("<style>.container { width:95% !important; }</style>"))
%autosave 0
%matplotlib inline
%load_ext autoreload
%autoreload 2

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"


# Imports for data analysis
import pandas as pd
import matplotlib.pyplot as plt
pd.set_option('display.max_rows', 2500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.max_colwidth', 2000)
pd.set_option('display.width', 2000)
pd.set_option('display.float_format', lambda x: '%.3f' % x)

#size=25
size=15
params = {'legend.fontsize': 'large',
          'figure.figsize': (20,8),
          'axes.labelsize': size,
          'axes.titlesize': size,
          'xtick.labelsize': size*0.75,
          'ytick.labelsize': size*0.75,
          'axes.titlepad': 25}
plt.rcParams.update(params)

15

rcParams的更改非常细致,大多数情况下,你只需要缩放所有字体大小,以便在图中更清晰地看到它们。图形大小是一个好技巧,但是您必须为所有图形都进行设置。另一种方法(不纯粹是matplotlib,或者如果您不使用seaborn可能过于复杂)就是使用seaborn仅设置字体比例:

sns.set_context('paper', font_scale=1.4)

免责声明:我知道,如果您只使用matplotlib,那么您可能不想为缩放图表而安装整个模块(我的意思是为什么不这样做),或者如果您使用seaborn,则具有更多的选项控制权。 但是,在您的数据科学虚拟环境中安装了seaborn,但在此笔记本中未使用它的情况下,存在这种情况。无论如何,这是另一种解决方案。


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