如何在matplotlib图上更改字体大小

Her*_*aaf 473 python matplotlib font-size

如何在matplotlib图上更改所有元素(刻度,标签,标题)的字体大小?

我知道如何更改刻度标签尺寸,这是通过以下方式完成的:

import matplotlib 
matplotlib.rc('xtick', labelsize=20) 
matplotlib.rc('ytick', labelsize=20) 
Run Code Online (Sandbox Code Playgroud)

但是如何改变其余部分呢?

Her*_*aaf 535

matplotlib文档中,

font = {'family' : 'normal',
        'weight' : 'bold',
        'size'   : 22}

matplotlib.rc('font', **font)
Run Code Online (Sandbox Code Playgroud)

这将所有项的字体设置为kwargs对象指定的字体font.

或者,您也可以使用此答案中rcParams update建议的方法:

matplotlib.rcParams.update({'font.size': 22})
Run Code Online (Sandbox Code Playgroud)

要么

import matplotlib.pyplot as plt
plt.rcParams.update({'font.size': 22})
Run Code Online (Sandbox Code Playgroud)

您可以在Customizing matplotlib页面上找到可用属性的完整列表.

  • 由于许多人以`import matplotlib.pyplot作为plt`开头,你可能想指出`pyplot`也有`rc`.你可以做`plt.rc(...`而不必改变你的进口. (67认同)
  • 对于不耐烦:默认字体大小为10,与第二个链接一样. (13认同)
  • @ user32882 - 不是永久的,它没有保存到磁盘,但我认为它会改变在相同代码中生成的后续图,除非原始值被存储和恢复,这并不总是很方便。您可以执行类似`for label in (ax.get_xticklabels() + ax.get_yticklabels()): label.set_fontsize(22)` 之类的操作来影响单个图形中的文本大小。 (4认同)
  • 如果你想暂时改变字体大小,`plt.style.context`将接受`rcParams`的字典,如下所示:`with plt.style.context({'font.size': 22}):` (4认同)
  • 我在哪里可以找到诸如“家庭”、“重量”等元素的更多选项? (3认同)
  • 很好,除了它覆盖在它上面找到的任何fontsize属性è_é (2认同)
  • @赫尔曼沙夫;我之前访问过那个页面。我想知道“家庭”的所有选项,例如“普通”、“无衬线”等。 (2认同)

Ped*_*rte 218

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

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
Run Code Online (Sandbox Code Playgroud)

请注意,您还可以设置调用rc方法的大小matplotlib:

import matplotlib

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

# and so on ...
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了很多答案.这个看起来最好,至少在Jupyter笔记本中.只需复制顶部的上面的块并自定义三个字体大小常量. (7认同)
  • 对我来说,标题大小不起作用.我用过:``plt.rc('axes',titlesize = BIGGER_SIZE)`` (6认同)
  • 同意 fvitkor,这是最好的答案! (3认同)
  • 我认为您可以将同一对象的所有设置合并为一行。例如,`plt.rc('axes', titlesize=SMALL_SIZE, labelsize=MEDIUM_SIZE)` (2认同)

Mar*_*gan 180

matplotlib.rcParams.update({'font.size': 22})
Run Code Online (Sandbox Code Playgroud)

  • 在可能的情况下,只有当我创建第一个绘图,然后按照建议“更新”时,此解决方案才有效,这会导致新图形的字体大小更新。也许第一个图是初始化 rcParams 所必需的...... (2认同)

ryg*_*gyr 178

如果要仅为已创建的特定绘图更改fontsize,请尝试以下操作:

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)
Run Code Online (Sandbox Code Playgroud)

  • 要获得传说,请使用ax.legend().get_texts().在Matplotlib 1.4上测试. (5认同)
  • 我的目的是让 xy 标签、刻度线和标题的字体具有不同的大小。这个的修改版本对我来说非常有效。 (2认同)
  • @詹姆斯S。而是使用“ax.get_legend().get_texts()”,因为“ax.legend()”除了返回“ax.get_legend()”的值之外,还使用默认参数重新绘制整个图例。 (2认同)

bin*_*unt 61

更新:请参阅答案的底部以获得更好的方法.
更新#2:我也想到了更改图例标题字体.
更新#3:Matplotlib 2.0.0中存在一个错误,导致对数轴的刻度标签恢复为默认字体.应该在2.0.1中修复,但我在答案的第二部分中包含了变通方法.

这个答案适用于任何想要更改所有字体的人,包括图例,以及任何试图为每件事使用不同字体和大小的人.它不使用rc(这对我来说似乎不起作用).这是相当麻烦但我无法亲自掌握任何其他方法.它基本上将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()
Run Code Online (Sandbox Code Playgroud)

这种方法的好处是,通过使用多个字体词典,您可以为各种标题选择不同的字体/大小/重量/颜色,选择刻度标签的字体,并选择图例的字体,所有这些都是独立的.


更新:

我已经找到了一个稍微不同的,不那么杂乱的方法,废除了字体词典,并允许你的系统上的任何字体,甚至.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()
Run Code Online (Sandbox Code Playgroud)

希望这是一个全面的答案


Pro*_*ter 32

这是一种完全不同的方法,可以很好地改变字体大小:

改变数字大小!

我通常使用这样的代码:

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)
Run Code Online (Sandbox Code Playgroud)

较小你做图的大小,更大的字体是相对于情节.这也使标记升级.注意我也设置了dpi每英寸点数.我是在AMTA(美国模特教师)论坛上发表的.以上代码示例:在此输入图像描述

  • 为避免轴标签被切断,请使用`bbox_inches`参数`fig.savefig('Basic.png',bbox_inches ="tight")保存图形. (6认同)

sta*_*010 28

以下是我在 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)
Run Code Online (Sandbox Code Playgroud)


And*_*aev 19

使用 plt.tick_params(labelsize=14)

  • 感谢您提供的代码段,它们可能会提供一些有限的即时帮助。适当的解释将通过描述为什么这是解决问题的好方法,从而极大地改善其[长期价值](https://meta.stackexchange.com/q/114762/206345),并将使其对将来更有用有其他类似问题的读者。请编辑您的答案以添加一些解释,包括您所做的假设。 (3认同)
  • 这不是只是改变了刻度字体大小吗? (2认同)

ani*_*in4 15

对 的更改rcParams非常精细,大多数时候您想要的只是缩放所有字体大小,以便可以在图中更好地看到它们。人物尺寸是一个很好的技巧,但你必须为所有人物携带它。另一种方法(不纯粹是 matplotlib,或者如果你不使用 seaborn 的话可能有点矫枉过正)是用 seaborn 设置字体比例:

sns.set_context('paper', font_scale=1.4)
Run Code Online (Sandbox Code Playgroud)

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


ham*_*yad 13

您可以使用plt.rcParams["font.size"]设置font_sizematplotlib,你也可以使用plt.rcParams["font.family"]设置font_familymatplotlib。试试这个例子:

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')
Run Code Online (Sandbox Code Playgroud)


小智 7

我完全同意 Huster 教授的观点,最简单的方法是更改​​图形的大小,这样可以保留默认字体。在将图形另存为 pdf 时,我只需要使用 bbox_inches 选项对此进行补充,因为轴标签已被剪切。

import matplotlib.pyplot as plt
plt.figure(figsize=(4,3))
plt.savefig('Basic.pdf', bbox_inches='tight')
Run Code Online (Sandbox Code Playgroud)


Inv*_*olf 7

我只是想指出,Herman SchaafPedro M Duarte 的答案都有效,但您必须在实例化之前执行此操作subplots(),这些设置不会影响已实例化的对象。我知道这不是什么难事,但当我在调用 subplots() 后尝试使用这些更改时,我花了相当长的时间弄清楚为什么这些答案对我不起作用。

例如:

import matplotlib.pyplot as plt
plt.rcParams.update({'font.size': 6,})
fig, ax = plt.subplots()
#create your plot
plt.show()
Run Code Online (Sandbox Code Playgroud)

或者

SMALL_SIZE = 8
MEDIUM_SIZE = 10
BIGGER_SIZE = 12

plt.rc('font', size=SMALL_SIZE)          # controls default text sizes
plt.rc('xtick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
plt.rc('ytick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
fig, ax = plt.subplots()
#create your plot
plt.show()
Run Code Online (Sandbox Code Playgroud)


nvd*_*nvd 6

基于以上内容:

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

fontPath = "/usr/share/fonts/abc.ttf"
font = fm.FontProperties(fname=fontPath, size=10)
font2 = fm.FontProperties(fname=fontPath, size=24)

fig = plt.figure(figsize=(32, 24))
fig.text(0.5, 0.93, "This is my Title", horizontalalignment='center', fontproperties=font2)

plot = fig.add_subplot(1, 1, 1)

plot.xaxis.get_label().set_fontproperties(font)
plot.yaxis.get_label().set_fontproperties(font)
plot.legend(loc='upper right', prop=font)

for label in (plot.get_xticklabels() + plot.get_yticklabels()):
    label.set_fontproperties(font)
Run Code Online (Sandbox Code Playgroud)


Mic*_* H. 5

这是 Marius Retegan答案的扩展。您可以使用所有修改制作一个单独的 JSON 文件,然后使用 rcParams.update 加载它。更改将仅适用于当前脚本。所以

import json
from matplotlib import pyplot as plt, rcParams

s = json.load(open("example_file.json")
rcParams.update(s)
Run Code Online (Sandbox Code Playgroud)

并将此“example_file.json”保存在同一文件夹中。

{
  "lines.linewidth": 2.0,
  "axes.edgecolor": "#bcbcbc",
  "patch.linewidth": 0.5,
  "legend.fancybox": true,
  "axes.color_cycle": [
    "#348ABD",
    "#A60628",
    "#7A68A6",
    "#467821",
    "#CF4457",
    "#188487",
    "#E24A33"
  ],
  "axes.facecolor": "#eeeeee",
  "axes.labelsize": "large",
  "axes.grid": true,
  "patch.edgecolor": "#eeeeee",
  "axes.titlesize": "x-large",
  "svg.fonttype": "path",
  "examples.directory": ""
}
Run Code Online (Sandbox Code Playgroud)