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

2025-01-14 08:50:00
admin
原创
90
摘要:问题描述:如何更改 matplotlib 图上所有元素(刻度、标签、标题)的字体大小?我知道如何更改刻度标签的大小,方法是:import matplotlib matplotlib.rc('xtick', labelsize=20) matplotlib.rc('ytick', labelsize=20)...

问题描述:

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

我知道如何更改刻度标签的大小,方法是:

import matplotlib 
matplotlib.rc('xtick', labelsize=20) 
matplotlib.rc('ytick', labelsize=20) 

但怎样才能改变其余部分呢?


解决方案 1:

来自matplotlib 文档,

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

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

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

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

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

或者

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

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

解决方案 2:

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

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

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

import matplotlib

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

# and so on ...

解决方案 3:

如果您只想更改已创建的特定图的字体大小,请尝试以下操作:

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)

解决方案 4:

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

解决方案 5:

此答案适用于任何试图更改所有字体(包括图例)的人,以及任何试图对每件事使用不同字体和大小的人。它不使用 rc(这对我来说似乎不起作用)。这可能有点麻烦,但我个人无法掌握任何其他方法。

我制定了一个与下面我原来的答案略有不同、更简洁的方法。它允许使用系统上的任何字体,甚至是.otf字体。要为每件事设置单独的字体,只需编写 morefont_pathfont_proplike 变量即可。

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:WindowsFontsAGaramondPro-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:WindowsFontsArial.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()

通过拥有多个字体词典,您可以为各个标题选择不同的字体/大小/粗细/颜色,为刻度标签选择字体,为图例选择字体,所有这些都可以独立进行。

解决方案 6:

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

改变图形大小

我通常使用这样的代码:

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)

图形尺寸越小,字体相对于图就越大。这也会放大标记。注意,我还设置了每英寸点数。我从 AMTA(美国建模教师协会)论坛上的一篇帖子中了解到了这一点。来自上述代码的示例:dpi在此处输入图片描述

解决方案 7:

使用plt.tick_params(labelsize=14)

解决方案 8:

您可以使用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')

请查看输出:

解决方案 9:

以下是我在 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)

解决方案 10:

对的更改rcParams非常细微,大多数时候你只需要缩放所有字体大小,以便在图中更好地显示它们。图形大小是一个很好的技巧,但你必须将它应用于所有图形。另一种方法(不是纯粹的 matplotlib,或者如果你不使用 seaborn 可能有点过头了)是只用 seaborn 设置字体比例:

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

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

解决方案 11:

根据以上内容:

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)

解决方案 12:

我只是想指出,Herman Schaaf和Pedro M Duarte 的答案都有效,但你必须在实例化之前这样做subplots(),这些设置不会影响已经实例化的对象。我知道这不难,但我花了很长时间才弄清楚为什么当我在调用 subplots() 后尝试使用这些更改时,这些答案对我不起作用。

例如:

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

或者

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

解决方案 13:

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

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

解决方案 14:

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

import json
from matplotlib import pyplot as plt, rcParams

s = json.load(open("example_file.json")
rcParams.update(s)

并将此“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": ""
}

解决方案 15:

评论中提到了这一点,但值得有自己的答案:

修改 figsize=dpi=调整图形大小和所有文本标签的比例:

fig, ax = plt.subplots(1, 1, figsize=(8, 4), dpi=100)

(或更短:)

fig, ax = plt.subplots(figsize=(8, 4), dpi=100)

这有点棘手:

  1. figsize实际上控制文本对于绘图范围的比例(以及绘图的纵横比)。

  2. dpi调整笔记本中的图形大小(保持文本的相对比例和绘图纵横比不变)。

解决方案 16:

我写了@ryggyr 答案的修改版本,以便更好地控制各个参数并适用于多个子图:

def set_fontsizes(axes,size,title=np.nan,xlabel=np.nan,ylabel=np.nan,xticks=np.nan,yticks=np.nan):
    if type(axes) != 'numpy.ndarray':
        axes=np.array([axes])
    
    options = [title,xlabel,ylabel,xticks,yticks]
    for i in range(len(options)):
        if np.isnan(options[i]):
            options[i]=size
        
    title,xlabel,ylabel,xticks,yticks=options
    
    for ax in axes.flatten():
        ax.title.set_fontsize(title)
        ax.xaxis.label.set_size(xlabel)
        ax.yaxis.label.set_size(ylabel)
        ax.tick_params(axis='x', labelsize=xticks)
        ax.tick_params(axis='y', labelsize=yticks)

解决方案 17:

跑步:

plt.rcParams.keys()

查看所有可修改的选项,并以类似的方式更改您喜欢的内容:

plt.rcParams['font.size'] = 22

plt.rcParams['ytick.labelsize'] = 12

plt.rcParams["figure.figsize"] = (12, 12)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用