当前位置:首页 > Python > 正文

Python绘图中文显示解决方案 - 解决matplotlib中文乱码问题

Python绘图中文显示解决方案

彻底解决Matplotlib中文乱码问题

为什么Matplotlib无法显示中文?

Matplotlib默认使用英文字体,不包含中文字符集,导致中文显示为方框或乱码。主要原因包括:

  • 默认字体不支持中文
  • 系统缺少合适的中文字体
  • 未正确配置字体参数

解决方案一:使用系统自带字体

这是最简单的方法,通过指定系统中已有的中文字体来解决中文显示问题。

import matplotlib.pyplot as plt
import matplotlib as mpl

# 设置中文字体 - 根据系统选择
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'KaiTi', 'SimSun']  # 设置支持中文的字体
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号

# 创建示例数据
x = [1, 2, 3, 4, 5]
y = [10, 15, 13, 18, 16]

# 创建图表
plt.figure(figsize=(8, 5))
plt.plot(x, y, marker='o', color='#3498db', linewidth=2)

# 添加中文标题和标签
plt.title('销售数据可视化', fontsize=16)
plt.xlabel('时间(月份)', fontsize=12)
plt.ylabel('销售额(万元)', fontsize=12)

# 显示网格
plt.grid(True, linestyle='--', alpha=0.7)

plt.show()

注意事项:

  • 不同操作系统字体名称不同:Windows可用"Microsoft YaHei"、"SimHei"、"KaiTi";MacOS可用"Arial Unicode MS"、"PingFang SC"
  • 务必设置plt.rcParams['axes.unicode_minus'] = False解决负号显示问题
  • 此方法适用于系统已安装相应中文字体的情况

解决方案二:使用自定义字体文件

当系统没有合适中文字体时,可加载自定义字体文件(如.ttf格式)。

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
from pathlib import Path

# 加载自定义字体文件
font_path = 'SourceHanSansCN-Regular.ttf'  # 替换为你的字体文件路径
font_prop = fm.FontProperties(fname=font_path)

# 创建数据
categories = ['电子产品', '服装', '食品', '书籍', '家居']
sales = [120, 85, 95, 70, 110]

# 创建柱状图
plt.figure(figsize=(10, 6))
bars = plt.bar(categories, sales, color=['#3498db', '#2ecc71', '#e74c3c', '#f39c12', '#9b59b6'])

# 添加中文标题和标签
plt.title('产品类别销售额对比', fontproperties=font_prop, fontsize=16)
plt.xlabel('产品类别', fontproperties=font_prop, fontsize=12)
plt.ylabel('销售额(万元)', fontproperties=font_prop, fontsize=12)

# 在柱子上方显示数值
for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2., height,
             f'{height}万', 
             ha='center', va='bottom',
             fontproperties=font_prop)

plt.xticks(fontproperties=font_prop)  # 设置x轴刻度字体
plt.show()

优点:

  • 不依赖系统字体
  • 可精确控制使用的字体
  • 方便项目迁移

注意事项:

  • 确保字体文件路径正确
  • 字体文件需包含中文字符集
  • 需为每个文本元素单独设置fontproperties

解决方案三:全局配置字体

修改Matplotlib配置文件实现全局中文支持,一劳永逸。

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

# 查找Matplotlib配置文件位置
print(mpl.matplotlib_fname())

# 手动修改配置文件步骤:
# 1. 找到配置文件(通常位于matplotlib/mpl-data/matplotlibrc)
# 2. 修改以下两行:
#    font.family: sans-serif
#    font.sans-serif: Microsoft YaHei, SimHei, DejaVu Sans, ... # 添加中文字体
# 3. 取消注释并设置:
#    axes.unicode_minus: False

# 重新加载配置
mpl.rcParams.update(mpl.rcParamsDefault)

# 创建示例图表
plt.figure(figsize=(8, 6))

# 生成数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# 绘制双线图
plt.plot(x, y1, label='正弦曲线', color='#e74c3c', linewidth=2)
plt.plot(x, y2, label='余弦曲线', color='#3498db', linewidth=2)

# 添加中文标题和标签
plt.title('三角函数曲线图', fontsize=16)
plt.xlabel('X轴', fontsize=12)
plt.ylabel('Y轴', fontsize=12)
plt.legend(fontsize=10)

# 添加网格和样式
plt.grid(True, linestyle='--', alpha=0.7)
plt.axhline(y=0, color='k', linewidth=0.8)
plt.axvline(x=0, color='k', linewidth=0.8)

plt.show()

推荐使用场景:

  • 长期使用Matplotlib进行中文可视化
  • 团队协作需要统一字体设置
  • 创建大量中文图表项目

解决方案对比

方法 优点 缺点 适用场景
系统自带字体 简单快捷,无需额外文件 依赖系统字体,跨平台兼容性差 快速原型开发,个人项目
自定义字体文件 精确控制,不依赖系统 需要管理字体文件,代码稍复杂 项目部署,跨平台应用
全局配置 一劳永逸,无需每次设置 配置复杂,影响所有项目 长期使用,团队协作

最佳实践建议

对于大多数用户,推荐方法一(系统自带字体)作为起点,简单有效。
对于正式项目或需要部署的应用,建议使用方法二(自定义字体文件)确保跨平台兼容性。

常见问题解答

Q 设置了中文字体但仍有部分文字显示为方框?

这可能是因为:

  1. 使用的字体不包含所有需要的汉字(尤其是生僻字)
  2. 特殊位置如legend、annotate等未正确设置字体
  3. 缓存问题 - 尝试清除Matplotlib缓存(plt.rcParams.update(plt.rcParamsDefault)

Q 如何在Jupyter Notebook中永久解决中文显示问题?

推荐方法:

  1. 在Notebook开头添加字体设置代码:
  2. import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 或其他中文字体
    plt.rcParams['axes.unicode_minus'] = False
  3. 或创建ipython配置文件:~/.ipython/profile_default/ipython_config.py

Q 哪些中文字体适合数据可视化?

推荐字体:

  • 思源黑体:开源、现代、支持多种字重
  • 微软雅黑:Windows系统自带,清晰易读
  • 方正兰亭黑:专业设计,适合屏幕显示
  • 苹方:MacOS系统自带,优秀显示效果

避免使用衬线字体(如宋体)用于图表,无衬线字体在屏幕上显示更清晰。

© 2023 Python可视化中文解决方案教程 | 本教程提供多种方法解决Matplotlib中文显示问题

发表评论