pin_drop当前位置:知识文库 ❯ 图文

Matplotlib中文显示完全指南 - 字体配置、乱码解决、跨平台

Matplotlib中文显示完全指南 - 字体配置、乱码解决、跨平台 | 小确幸生活

一、中文显示问题概述

matplotlib默认不支持中文显示,中文字符会显示为方块或乱码。这是因为matplotlib默认使用DejaVu Sans等英文字体,这些字体不包含中文字符。解决中文显示问题需要配置支持中文的字体。

主要有三种配置方式:全局配置rcParams(最简单推荐)、局部使用FontProperties(灵活控制)、以及修改matplotlibrc配置文件(一劳永逸)。正确配置后,标题、坐标轴标签、图例等所有位置都可以正常显示中文。

二、三种解决方案

方案1:全局配置rcParams(推荐)

最简单直接的方式,在代码开头设置一次,后续所有图表都会生效:

代码示例

import matplotlib.pyplot as plt

# 全局配置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False     # 正常显示负号

同时设置axes.unicode_minus = False非常重要,否则负号会显示为方块。

方案2:局部字体FontProperties

适合在同一图表中使用不同字体的场景:

代码示例

from matplotlib.font_manager import FontProperties

font = FontProperties(family='SimHei', size=14)
plt.title('中文标题', fontproperties=font)

方案3:修改matplotlibrc配置文件

一劳永逸的方式,修改后所有Python脚本都不需要额外配置:

  • 查找配置文件位置import matplotlib; print(matplotlib.matplotlib_fname())

  • 修改配置项:找到font.sans-serif,在列表最前面添加SimHei

  • 设置负号:找到axes.unicode_minus改为False

三、常用中文字体列表

Windows系统常用中文字体

字体名 文件名 说明
SimHei simhei.ttf 黑体(推荐,最常用)
Microsoft YaHei msyh.ttc 微软雅黑,现代感
SimSun simsun.ttc 宋体,传统风格
FangSong simfang.ttf 仿宋
KaiTi simkai.ttf 楷体

macOS系统常用中文字体

  • Arial Unicode MS:macOS默认支持

  • Heiti SC:黑体-简

  • PingFang SC:苹方(macOS 10.11+)

小贴士

建议配置多个备选字体,如['SimHei', 'Microsoft YaHei', 'SimSun']。matplotlib会按列表顺序尝试,如果第一个不可用会自动使用下一个,提高跨平台兼容性。

四、代码示例实战

示例1:全局配置中文显示

代码示例

import matplotlib.pyplot as plt
import numpy as np

# 全局配置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False     # 正常显示负号

# 绘制带中文的图表
x = np.linspace(0, 2 * np.pi, 100)

plt.figure(figsize=(8, 5))
plt.plot(x, np.sin(x), 'b-', linewidth=2, label='正弦函数')
plt.plot(x, np.cos(x), 'r--', linewidth=2, label='余弦函数')

plt.title('三角函数图像')
plt.xlabel('弧度')
plt.ylabel('函数值')
plt.legend()
plt.grid(True, alpha=0.3)
plt.savefig('chinese_display.png', dpi=100, bbox_inches='tight')
print("中文显示图表已保存")

输出:

代码示例

中文显示图表已保存

示例2:查看可用中文字体与局部字体设置

代码示例

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties, fontManager

# 查看系统可用中文字体
chinese_fonts = []
for f in fontManager.ttflist:
    if any(name in f.name.lower() for name in ['sim', 'hei', 'song', 'kai', 'yahei', 'ming', 'fang']):
        chinese_fonts.append(f.name)

chinese_fonts = sorted(set(chinese_fonts))
print("系统可用中文字体:")
for font_name in chinese_fonts[:10]:
    print(f"  {font_name}")

# 使用FontProperties局部设置
font_hei = FontProperties(family='SimHei', size=14)
font_yahei = FontProperties(family='Microsoft YaHei', size=12)

x = np.linspace(0, 10, 50)
plt.figure(figsize=(8, 5))
plt.plot(x, np.sin(x), 'b-')
plt.title('使用黑体标题', fontproperties=font_hei)
plt.xlabel('横轴标签', fontproperties=font_yahei)
plt.ylabel('纵轴标签', fontproperties=font_yahei)
plt.savefig('local_font.png', dpi=100, bbox_inches='tight')
print("局部字体图表已保存")

输出:

代码示例

系统可用中文字体:
  SimHei
  SimSun
  Microsoft YaHei
  KaiTi
  FangSong
局部字体图表已保存

五、完整中文图表模板

以下是一个完整的中文数据分析图表模板,包含中文标题、坐标轴标签、图例和注释:

代码示例

import matplotlib.pyplot as plt
import numpy as np

# 中文显示配置
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'SimSun']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 11

# 模拟数据
months = ['1月', '2月', '3月', '4月', '5月', '6月',
          '7月', '8月', '9月', '10月', '11月', '12月']
beijing = [-3, 0, 8, 16, 22, 27, 30, 29, 23, 15, 6, -1]
shanghai = [4, 6, 10, 16, 21, 25, 30, 30, 26, 20, 13, 7]
guangzhou = [14, 15, 18, 23, 26, 28, 30, 30, 28, 24, 20, 15]

fig, ax = plt.subplots(figsize=(10, 6))

ax.plot(months, beijing, 'b-o', linewidth=2, markersize=5, label='北京')
ax.plot(months, shanghai, 'r-s', linewidth=2, markersize=5, label='上海')
ax.plot(months, guangzhou, 'g-^', linewidth=2, markersize=5, label='广州')

ax.set_title('三大城市月平均气温对比', fontsize=16, fontweight='bold')
ax.set_xlabel('月份', fontsize=13)
ax.set_ylabel('气温(°C)', fontsize=13)
ax.legend(fontsize=12, loc='upper left')
ax.grid(True, alpha=0.3)

# 添加中文注释
ax.annotate('北京最冷月', xy=(0, -3), xytext=(2, -5),
            arrowprops=dict(arrowstyle='->', color='blue'),
            fontsize=10, color='blue')

plt.tight_layout()
plt.savefig('chinese_template.png', dpi=150, bbox_inches='tight')
print("完整中文图表已保存")

输出:

代码示例

完整中文图表已保存

六、实际应用场景

  • 中文数据报告:所有图表标题和标签使用中文,方便国内读者理解

  • 业务系统仪表盘:中文显示是刚需,配置好字体后一键复用

  • 教学材料:中文标注帮助学生理解图表,降低学习门槛

七、注意事项

注意:设置中文字体后,必须同时设置axes.unicode_minus = False,否则图表中的负号会显示为方块。

注意:不同操作系统的中文字体不同,Windows用SimHei,macOS用Arial Unicode MS或PingFang SC。建议使用字体列表配置备选方案。

注意:如果配置的中文字体不可用,matplotlib会按font.sans-serif列表顺序尝试下一个字体,直到找到可用字体或使用默认字体。

八、常见问题FAQ

为什么设置了中文字体还是显示方块?

可能原因:1)字体名称拼写错误;2)该字体未安装到系统中;3)matplotlib缓存未更新。解决方法:使用fontManager.ttflist查看可用字体列表,删除matplotlib缓存目录(~/.matplotlib/fontList-*.json),然后重新运行。

负号显示为方块怎么办?

在设置中文字体的同时,必须添加plt.rcParams['axes.unicode_minus'] = False。这会让matplotlib使用ASCII的减号(-)代替Unicode减号(−),从而正常显示。

rcParams和FontProperties哪个更好?

rcParams适合全局统一配置,设置一次所有图表生效,代码简洁,推荐使用。FontProperties适合需要在同一图表中使用不同字体,或临时使用特殊字体的场景。大多数情况下rcParams已经够用。

Linux服务器上没有中文字体怎么办?

可以将Windows的字体文件(如simhei.ttf)复制到Linux的字体目录/usr/share/fonts/,然后运行fc-cache -fv更新字体缓存。或者直接使用FontProperties指定字体文件路径。


标签: 中文显示 字体配置 SimHei黑体 乱码解决 rcParams Python

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Matplotlib savefig保存图片完全指南 - DPI、格式选择、裁剪透明 下一篇: Python openpyxl库简介与安装教程 - Excel文件处理入门

poll相关推荐