Matplotlib 中如何更改字体:全面指南

Matplotlib 中如何更改字体:全面指南

参考:How to Change Fonts in matplotlib

Matplotlib 是 Python 中最流行的数据可视化库之一,它提供了丰富的绘图功能和自定义选项。在数据可视化中,字体的选择和设置对于图表的整体美观和可读性至关重要。本文将详细介绍如何在 Matplotlib 中更改字体,包括全局字体设置、局部字体设置、使用自定义字体等多个方面。

1. Matplotlib 中的字体系统

在深入了解如何更改字体之前,我们需要先了解 Matplotlib 中的字体系统。Matplotlib 使用一个字体管理器来处理字体相关的操作。这个字体管理器负责查找系统中可用的字体,并在绘图时应用指定的字体。

Matplotlib 支持多种字体格式,包括 TrueType (.ttf)、OpenType (.otf) 和 Type 1 (.pfa 和 .pfb) 等。默认情况下,Matplotlib 会使用系统中的默认字体,但我们可以通过多种方式来更改和自定义字体。

2. 查看可用字体

在更改字体之前,我们需要知道系统中有哪些可用的字体。Matplotlib 提供了一个简单的方法来列出所有可用的字体。

import matplotlib.font_manager as fm

# 列出所有可用字体
font_list = fm.findSystemFonts(fontpaths=None, fontext='ttf')

print("Available fonts from how2matplotlib.com:")
for font in font_list[:10]:  # 只打印前10个字体
    print(font)

Output:

Matplotlib 中如何更改字体:全面指南

这段代码会列出系统中所有可用的 TrueType 字体。由于字体列表可能很长,我们只打印前 10 个作为示例。

3. 全局字体设置

如果你想在整个 Matplotlib 环境中使用同一种字体,可以通过全局设置来实现。这种方法会影响所有的图表元素,包括标题、轴标签、刻度标签等。

import matplotlib.pyplot as plt
import matplotlib as mpl

# 设置全局字体
mpl.rcParams['font.family'] = 'Arial'

# 创建一个简单的图表
plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
plt.title('How2matplotlib.com: Global Font Example')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()

Output:

Matplotlib 中如何更改字体:全面指南

在这个例子中,我们将全局字体设置为 ‘Arial’。这会影响图表中的所有文本元素。你可以将 ‘Arial’ 替换为系统中任何可用的字体名称。

4. 局部字体设置

有时候,你可能只想更改图表中特定元素的字体,而不是全局更改。Matplotlib 允许你为每个文本元素单独设置字体。

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])

# 设置标题字体
plt.title('How2matplotlib.com: Local Font Example', fontname='Times New Roman', fontsize=16)

# 设置 x 轴标签字体
plt.xlabel('X-axis', fontname='Courier New', fontsize=12)

# 设置 y 轴标签字体
plt.ylabel('Y-axis', fontname='Verdana', fontsize=12)

plt.show()

Output:

Matplotlib 中如何更改字体:全面指南

在这个例子中,我们为标题、x 轴标签和 y 轴标签分别设置了不同的字体。这种方法给了我们更大的灵活性,可以根据需要为不同的元素选择最合适的字体。

5. 使用自定义字体

有时候,你可能想使用系统中没有的特殊字体。Matplotlib 允许你加载和使用自定义字体文件。

import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

# 加载自定义字体
custom_font = FontProperties(fname='/path/to/your/custom_font.ttf')

plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])

# 使用自定义字体
plt.title('How2matplotlib.com: Custom Font Example', fontproperties=custom_font, fontsize=16)
plt.xlabel('X-axis', fontproperties=custom_font, fontsize=12)
plt.ylabel('Y-axis', fontproperties=custom_font, fontsize=12)

plt.show()

在这个例子中,我们首先加载了一个自定义字体文件,然后将其应用到图表的各个文本元素上。请确保将 ‘/path/to/your/custom_font.ttf’ 替换为你实际的字体文件路径。

6. 设置字体样式

除了更改字体家族,Matplotlib 还允许你设置字体的样式,如粗体、斜体等。

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])

# 设置粗体标题
plt.title('How2matplotlib.com: Bold Font Example', fontweight='bold', fontsize=16)

# 设置斜体 x 轴标签
plt.xlabel('X-axis', fontstyle='italic', fontsize=12)

# 设置粗斜体 y 轴标签
plt.ylabel('Y-axis', fontweight='bold', fontstyle='italic', fontsize=12)

plt.show()

Output:

Matplotlib 中如何更改字体:全面指南

这个例子展示了如何设置粗体、斜体和粗斜体文本。你可以根据需要组合这些样式属性。

7. 使用 LaTeX 渲染文本

对于需要显示数学公式的图表,Matplotlib 支持使用 LaTeX 渲染文本。这需要你的系统中安装了 LaTeX。

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])

# 使用 LaTeX 渲染标题
plt.title(r'\mathbf{How2matplotlib.com:} \mathcal{L}aTeX \mathrm{Example}', fontsize=16)

# 使用 LaTeX 渲染 x 轴标签
plt.xlabel(r'x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}', fontsize=12)

# 使用 LaTeX 渲染 y 轴标签
plt.ylabel(r'\int_0^\infty e^{-x^2} dx = \frac{\sqrt{\pi}}{2}', fontsize=12)

plt.show()

Output:

Matplotlib 中如何更改字体:全面指南

在这个例子中,我们使用 LaTeX 语法来渲染标题和轴标签。注意字符串前的 ‘r’ 前缀,它表示这是一个原始字符串,防止反斜杠被转义。

8. 设置字体大小

字体大小是另一个重要的字体属性。Matplotlib 允许你精确控制文本元素的大小。

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])

# 设置不同大小的文本
plt.title('How2matplotlib.com: Font Size Example', fontsize=20)
plt.xlabel('X-axis', fontsize=14)
plt.ylabel('Y-axis', fontsize=14)

# 添加一些文本注释
plt.text(2, 3, 'Large Text', fontsize=18)
plt.text(3, 2, 'Small Text', fontsize=8)

plt.show()

Output:

Matplotlib 中如何更改字体:全面指南

这个例子展示了如何为不同的文本元素设置不同的字体大小。你可以根据需要调整这些值,以获得最佳的视觉效果。

9. 使用字体字典

如果你需要在多个地方使用相同的字体设置,可以创建一个字体字典,然后在需要的地方引用它。

import matplotlib.pyplot as plt

# 创建字体字典
font_dict = {'family': 'serif',
             'color':  'darkred',
             'weight': 'normal',
             'size': 16,
             }

plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])

# 使用字体字典
plt.title('How2matplotlib.com: Font Dictionary Example', fontdict=font_dict)
plt.xlabel('X-axis', fontdict=font_dict)
plt.ylabel('Y-axis', fontdict=font_dict)

plt.show()

Output:

Matplotlib 中如何更改字体:全面指南

这个方法可以帮助你保持字体设置的一致性,并且使代码更加简洁。

10. 设置刻度标签字体

除了主要的文本元素,你可能还想自定义刻度标签的字体。

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])

# 设置刻度标签字体
plt.xticks(fontname='Courier', fontsize=10, color='blue')
plt.yticks(fontname='Courier', fontsize=10, color='red')

plt.title('How2matplotlib.com: Tick Label Font Example')
plt.show()

这个例子展示了如何更改 x 轴和 y 轴刻度标签的字体、大小和颜色。

11. 在子图中设置字体

当你创建包含多个子图的复杂图表时,可能需要为每个子图单独设置字体。

import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# 第一个子图
ax1.plot([1, 2, 3, 4], [1, 4, 2, 3])
ax1.set_title('How2matplotlib.com: Subplot 1', fontname='Arial', fontsize=14)
ax1.set_xlabel('X-axis', fontname='Times New Roman', fontsize=12)
ax1.set_ylabel('Y-axis', fontname='Courier', fontsize=12)

# 第二个子图
ax2.plot([1, 2, 3, 4], [3, 2, 4, 1])
ax2.set_title('How2matplotlib.com: Subplot 2', fontname='Verdana', fontsize=14)
ax2.set_xlabel('X-axis', fontname='Helvetica', fontsize=12)
ax2.set_ylabel('Y-axis', fontname='Georgia', fontsize=12)

plt.tight_layout()
plt.show()

在这个例子中,我们为两个子图分别设置了不同的字体。这种方法允许你在同一个图表中使用多种字体风格。

12. 使用 CSS 样式字体规范

Matplotlib 还支持使用 CSS 样式的字体规范,这提供了更多的灵活性。

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])

# 使用 CSS 样式字体规范
plt.title('How2matplotlib.com: CSS-like Font Example', 
          fontdict={'family': 'sans-serif', 'weight': 'bold', 'size': 16})
plt.xlabel('X-axis', fontdict={'family': 'monospace', 'style': 'italic', 'size': 12})
plt.ylabel('Y-axis', fontdict={'family': 'serif', 'variant': 'small-caps', 'size': 12})

plt.show()

Output:

Matplotlib 中如何更改字体:全面指南

这个例子展示了如何使用类似 CSS 的字体规范来设置字体。这种方法提供了更细粒度的控制,允许你指定字体家族、重量、样式和变体等属性。

13. 动态调整字体大小

在某些情况下,你可能需要根据图表的大小动态调整字体大小。这在创建响应式图表时特别有用。

import matplotlib.pyplot as plt

def adjust_font_size(fig, base_size=12):
    width, height = fig.get_size_inches()
    scale_factor = min(width, height) / 8  # 假设 8 英寸是基准大小
    return base_size * scale_factor

fig, ax = plt.subplots(figsize=(10, 6))
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])

font_size = adjust_font_size(fig)

ax.set_title('How2matplotlib.com: Dynamic Font Size Example', fontsize=font_size*1.2)
ax.set_xlabel('X-axis', fontsize=font_size)
ax.set_ylabel('Y-axis', fontsize=font_size)

plt.show()

Output:

Matplotlib 中如何更改字体:全面指南

这个例子定义了一个函数来根据图表的大小动态计算字体大小。这可以确保文本在不同大小的图表中都保持合适的比例。

14. 使用 fontproperties 对象

对于更复杂的字体设置,你可以使用 FontProperties 对象。这允许你创建一个包含多个字体属性的对象,然后在多个地方重复使用。

import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

# 创建 FontProperties 对象
font_prop = FontProperties(family='serif', weight='bold', style='italic', size=14)

plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])

# 使用 FontProperties 对象
plt.title('How2matplotlib.com: FontProperties Example', fontproperties=font_prop)
plt.xlabel('X-axis', fontproperties=font_prop)
plt.ylabel('Y-axis', fontproperties=font_prop)

plt.show()

Output:

Matplotlib 中如何更改字体:全面指南

使用 FontProperties 对象可以让你更容易地在多个文本元素之间保持一致的字体设置,同时还提供了更细粒度的控制。

15. 处理中文和其他非英语字符

当你需要在图表中显示中文或其他非英语字符时,可能需要特别注意字体的选择和设置。

import matplotlib.pyplot as plt
import matplotlib as mpl

# 设置全局字体以支持中文
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
mpl.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])

plt.title('How2matplotlib.com: 中文字体示例', fontsize=16)
plt.xlabel('X轴', fontsize=12)
plt.ylabel('Y轴', fontsize=12)

plt.show()

Output:

Matplotlib 中如何更改字体:全面指南

这个例子展示了如何设置全局字体以支持中文字符。注意,你可能需要根据你的系统和可用字体来调整 ‘SimHei’ 的设置。

16. 在图例中使用不同字体

图例是图表中另一个重要的文本元素,你可能想为其设置特定的字体。

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3], label='Line 1')
plt.plot([1, 2, 3, 4], [3, 2, 4, 1], label='Line 2')

plt.title('How2matplotlib.com: Legend Font Example')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')

# 设置图例字体
plt.legend(prop={'family': 'monospace', 'size': 10})

plt.show()

Output:

Matplotlib 中如何更改字体:全面指南

这个例子展示了如何为图例设置特定的字体家族和大小。

17. 在文本注释中使用字体

当你在图表中添加文本注释时,也可以自定义其字体设置。

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])

plt.title('How2matplotlib.com: Text Annotation Font Example')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')

# 添加带有自定义字体的文本注释
plt.annotate('Important Point', xy=(2, 4), xytext=(3, 3),
             arrowprops=dict(facecolor='black', shrink=0.05),
             fontname='Times New Roman', fontsize=12, fontstyle='italic')

plt.show()

Output:

Matplotlib 中如何更改字体:全面指南

这个例子展示了如何为文本注释设置特定的字体、大小和样式。

18. 在极坐标图中设置字体

极坐标图有其特殊的文本元素,如角度标签和径向标签,你可能想为它们设置特定的字体。

import matplotlib.pyplot as plt
import numpy as np

r = np.arange(0, 2, 0.01)
theta = 2 * np.pi * r

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'}, figsize=(8, 8))
ax.plot(theta, r)

# 设置极坐标图的字体
ax.set_title("How2matplotlib.com: Polar Plot Font Example", fontname='Arial', fontsize=14)
ax.set_rticks([0.5, 1, 1.5])  # 径向刻度
ax.set_rlabel_position(22.5)  # 径向标签位置
ax.tick_params(axis='both', which='major', labelsize=10, labelcolor='blue')

plt.show()

Output:

Matplotlib 中如何更改字体:全面指南

这个例子展示了如何在极坐标图中设置标题和刻度标签的字体属性。

19. 在 3D 图中设置字体

3D 图也有其特殊的文本元素,如 z 轴标签,你可能想为它们设置特定的字体。

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')

# 生成一些示例数据
x = np.arange(-5, 5, 0.25)
y = np.arange(-5, 5, 0.25)
x, y = np.meshgrid(x, y)
r = np.sqrt(x**2 + y**2)
z = np.sin(r)

# 绘制 3D 表面
surf = ax.plot_surface(x, y, z)

# 设置 3D 图的字体
ax.set_title("How2matplotlib.com: 3D Plot Font Example", fontname='Courier', fontsize=14)
ax.set_xlabel('X-axis', fontname='Times New Roman', fontsize=12)
ax.set_ylabel('Y-axis', fontname='Times New Roman', fontsize=12)
ax.set_zlabel('Z-axis', fontname='Times New Roman', fontsize=12)

plt.show()

这个例子展示了如何在 3D 图中为标题和轴标签设置特定的字体。

20. 使用 style sheets 设置字体

Matplotlib 提供了 style sheets,它们允许你一次性设置多个绘图参数,包括字体。

import matplotlib.pyplot as plt
import matplotlib.style as style

# 使用 'seaborn' 样式
style.use('seaborn')

plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])

plt.title('How2matplotlib.com: Style Sheet Font Example', fontsize=16)
plt.xlabel('X-axis', fontsize=12)
plt.ylabel('Y-axis', fontsize=12)

plt.show()

这个例子使用了 ‘seaborn’ 样式,它会改变整个图表的外观,包括字体设置。你可以尝试其他预定义的样式,如 ‘ggplot’、’fivethirtyeight’ 等,或者创建自己的自定义样式。

总结

在 Matplotlib 中更改字体是一个强大而灵活的功能,它可以极大地提升你的数据可视化效果。从全局字体设置到单个文本元素的精细调整,从使用系统字体到加载自定义字体,Matplotlib 提供了多种方法来满足不同的需求。

本文详细介绍了如何在 Matplotlib 中更改字体,包括全局设置、局部设置、使用自定义字体、设置字体样式和大小、处理特殊字符、在不同类型的图表中设置字体等多个方面。通过掌握这些技巧,你可以创建出既美观又专业的数据可视化图表。

记住,选择合适的字体不仅关乎美观,还关乎可读性和信息传达的效果。在选择字体时,要考虑你的目标受众、展示环境(如印刷品还是屏幕显示)以及整体的设计风格。同时,保持一致性也很重要,避免在同一个图表或一系列相关图表中使用过多不同的字体。

最后,随着你对 Matplotlib 的深入使用,你会发现还有更多与字体相关的高级技巧和设置。不断实践和探索,你将能够创建出更加精美和专业的数据可视化作品。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程