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

【已解决,亲测有效】解决使用Python Matplotlib库绘制图表中出现中文乱码(中文显示为框)的问题的方法

【已解决,亲测有效】解决使用Python Matplotlib库绘制图表中出现中文乱码(中文显示为框)的问题的方法

文章目录

  • 【已解决,亲测有效】解决使用Python Matplotlib库绘制图表中出现中文乱码(中文显示为框)的问题的方法
    • 前言
    • 1 问题分析:为什么会出现方框?
    • 2 解决方案
      • 2.1 方案一:动态指定(临时方案,推荐!)
      • 2.2 方案二:修改配置文件(一劳永逸)
    • 3 总结

前言

在使用Python的Matplotlib库进行数据可视化时,我们经常需要在图表的标题、坐标轴标签或图例中添加中文注释。然而,很多初学者都会遇到一个令人头疼的问题:设置好的中文全部显示成了“□”(方框),这也被称为“中文乱码”问题。本文将深入剖析这个问题产生的原因,并提供几种行之有效的解决方案,从临时解决到一劳永逸,总有一种适合你。

1 问题分析:为什么会出现方框?

让我们先来看一个简单的例子。当你尝试运行以下代码时,有很大概率会看到一张带有白色方框的图表。

import matplotlib.pyplot as plt
import numpy as np# 准备数据
x = np.arange(1, 6)
y = np.array([10, 8, 6, 4, 2])# 创建图表
plt.figure(figsize=(8, 6))
plt.plot(x, y, marker='o')# 添加中文标题和标签
plt.title("这是一个简单的折线图")
plt.xlabel("X轴:数据点")
plt.ylabel("Y轴:数值")# 显示图表
plt.show()

预期结果:一张带有中文标题和轴标签的折线图。
实际结果
出现问题的图

如上图所示,标题和坐标轴的中文部分全都变成了方框。

问题根源
这背后的原因其实很简单:Matplotlib的默认字体库不包含中文字符。

Matplotlib默认使用的字体(如DejaVu Sans)是一款优秀的英文字体,但它没有设计中文字符的字形(Glyph)。当Matplotlib尝试渲染一个中文字符时,它在字体文件中找不到对应的字形,只能用一个占位符“□”来代替,表示“此字符无法显示”。

2 解决方案

知道了问题根源,解决思路就很清晰了:为Matplotlib指定一个包含中文字符的字体

2.1 方案一:动态指定(临时方案,推荐!)

这是最常用、最灵活的方法,尤其适用于在不同的项目或环境中工作。它只在当前运行的Python脚本中生效,不会影响全局配置。

核心代码:通过 matplotlib.rcParams 来动态修改配置。

步骤

  1. 在绘图代码的开头,引入matplotlib
  2. 通过plt.rcParamsmatplotlib.rcParams设置字体。
  3. 【关键】 解决负号显示问题。更换字体后,可能会导致坐标轴的负号-也显示为方框,因为一些中文字体不处理Unicode的减号(U+2212),而是使用ASCII的连字符(-)。我们需要将axes.unicode_minus设置为False来解决这个问题。

下面是修改后的完整代码:

import matplotlib.pyplot as plt
import numpy as np# --- 新增代码开始 ---
# Windows系统
plt.rcParams['font.sans-serif'] = ['SimHei']  # 'SimHei' 是黑体的文件名
# Mac系统
# plt.rcParams['font.sans-serif'] = ['PingFang SC']
# Linux系统(需要确认已安装的字体)
# plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei']plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
# --- 新增代码结束 ---# 准备数据
x = np.arange(-5, 6)
y = x**2# 创建图表
plt.figure(figsize=(8, 6))
plt.plot(x, y, marker='o')# 添加中文标题和标签
plt.title("二次函数 $y = x^2$ 图像")
plt.xlabel("X轴:自变量")
plt.ylabel("Y轴:因变量")
plt.grid(True)# 显示图表
plt.show()

修改后,生成的图表即可正常显示:

正常显示中文的图表

如何找到可用的中文字体?

  • Windows: SimHei (黑体), KaiTi (楷体), Microsoft YaHei (微软雅黑) 等。
  • macOS: PingFang SC (苹方), STHeiti (华文黑体) 等。
  • Linux: WenQuanYi Micro Hei (文泉驿微米黑), Noto Sans CJK SC 等。需要通过fc-list :lang=zh命令查看已安装的中文字体。

优点

  • 代码自包含,移植性强,在任何环境中只要有对应字体就能运行。
  • 不污染全局配置,对其他Python项目无影响。

缺点

  • 需要在每个需要显示中文的脚本中都加入配置代码。

2.2 方案二:修改配置文件(一劳永逸)

如果你希望在你的开发环境中永久解决这个问题,修改Matplotlib的配置文件是最佳选择。

步骤

  1. 找到matplotlibrc配置文件
    运行以下Python代码可以找到配置文件的路径:

    import matplotlib
    print(matplotlib.matplotlib_fname())
    # 可能的输出: /path/to/your/python/env/lib/pythonX.X/site-packages/matplotlib/mpl-data/matplotlibrc
    
  2. 编辑配置文件
    用文本编辑器打开上述路径找到的matplotlibrc文件。
    matplotlibrc文件

  3. 修改字体设置
    在文件中找到 #font.sans-serif 这一行(大约在276行左右)。

    • 去掉前面的 # 注释符。
    • 在冒号后面添加你希望使用的中文字体名称,并确保它在列表的最前面。例如,在Windows上使用黑体:
      # 找到这行:
      #font.sans-serif: DejaVu Sans, Bitstream Vera Sans, ...# 修改为 (去掉'#'并在最前面加上'SimHei'):
      font.sans-serif: SimHei, DejaVu Sans, Bitstream Vera Sans, ...
      
  4. 修改负号设置
    在文件中找到 #axes.unicode_minus 这一行(大约在418行左右)。

    • 去掉前面的 # 注释符。
    • True改为False
      # 找到这行:
      #axes.unicode_minus: True# 修改为:
      axes.unicode_minus: False
      
  5. 清除缓存
    这是非常关键的一步! Matplotlib会缓存字体信息,修改配置文件后必须清除缓存才能生效。
    首先,找到缓存目录:

    import matplotlib
    print(matplotlib.get_cachedir())
    

    然后,删除这个目录下的所有文件和文件夹。下次运行Matplotlib时会自动重新生成。

完成以上步骤后,你就可以像最开始那样运行代码,无需添加任何额外配置,中文和负号都能完美显示了。

优点

  • 一次配置,永久生效,非常方便。

缺点

  • 如果你的Python环境重装或迁移,需要重新配置。
  • 配置是全局的,可能会影响所有使用该环境的Matplotlib项目。

3 总结

方案优点缺点适用场景
方案一:动态指定灵活,代码自包含,可移植性强每个脚本都需要添加配置共享代码、教学演示、不同项目切换
方案二:修改配置文件一劳永逸,代码简洁配置过程稍复杂,影响全局环境个人固定开发环境

对于大多数开发者来说,方案一(动态指定)是首选,因为它能让你的代码更具鲁棒性和可移植性。而对于在个人电脑上进行大量数据分析工作的用户,方案二(修改配置文件) 则能提供极大的便利。


希望这篇文章能帮助你彻底告别Matplotlib的中文方框问题,让你的数据可视化作品更加清晰、美观!


文章转载自:

http://FHMeONRh.yrhsg.cn
http://db0jMwbH.yrhsg.cn
http://hjy7TlAX.yrhsg.cn
http://C8Bm8dxn.yrhsg.cn
http://TNuYrspV.yrhsg.cn
http://UaeyvSOl.yrhsg.cn
http://nxYLZTDF.yrhsg.cn
http://ZNG5ikjO.yrhsg.cn
http://srJKkd9I.yrhsg.cn
http://d0LgCdN5.yrhsg.cn
http://5BOd8Vlr.yrhsg.cn
http://krvzmbmg.yrhsg.cn
http://J2ClXltM.yrhsg.cn
http://e6v4vKZ3.yrhsg.cn
http://t3xtoPO9.yrhsg.cn
http://CCQVgGYq.yrhsg.cn
http://sBv9cmNp.yrhsg.cn
http://lGDavvqn.yrhsg.cn
http://xtTihASb.yrhsg.cn
http://BeVPeeXc.yrhsg.cn
http://VJY2d1yo.yrhsg.cn
http://qr0meBhY.yrhsg.cn
http://31uiPYB2.yrhsg.cn
http://DYfohAcS.yrhsg.cn
http://aRdRH0sH.yrhsg.cn
http://rcPXhaXA.yrhsg.cn
http://u6DNzxNe.yrhsg.cn
http://sHXUlhz4.yrhsg.cn
http://rMNSNhn5.yrhsg.cn
http://p3FqNQkJ.yrhsg.cn
http://www.dtcms.com/a/373685.html

相关文章:

  • STL库——二叉搜索树
  • 探索命令行之谜:ps -aux 和 ps aux 是一样的吗?
  • leetcode11(H 指数)
  • TensorRT自定义量化 对数量化
  • 【Python】S1 基础篇 P4 if 语句指南
  • 在使用ffmpeg与音转文模型时,会报错音转文stack expects a non-empty Tensor List
  • 苏州ecovadis认证500人内费用多少?
  • 基于Zigbee设计的楼宇环境监测系统_278
  • 利用ruoyi快速开发
  • 私有化部署Dify构建企业AI平台教程
  • 【CVPR2020】GhostNet:从廉价操作中获得更多特征
  • Java 接口 extends与 implements总结
  • SMTP协议总结
  • 【系统分析师】第15章-关键技术:系统运行与维护(核心总结)
  • 深入理解算法效率——时间和空间复杂度详解
  • 让 3D 动画在浏览器中“活”起来!
  • Acrobat/Reader JavaScript 开发:Net.HTTP.Request 的使用与限制
  • QT通过QModbusRtuSerialMaster读写电子秤数据实例
  • 【实战中提升自己】内网安全部署之STP的安全技术部署
  • MYSQL数据库初阶 之 MySQL索引特性1【索引概念】
  • Django入门:框架基础与环境搭建
  • 数据结构题集-第四章-串-基础知识题
  • 【golang学习笔记 gin 】1.1 路由封装和mysql 的使用封装
  • django5个人笔记
  • Linux 进程信号之信号的保存
  • 详细讲解锥齿轮丝杆升降机的加工制造工艺
  • nginx配置前端请求转发到指定的后端ip
  • 【Linux】文件管理:压缩、归档与传输
  • 大数据各组件flume,datax,presto,DolphinScheduler,findBI在大数据数仓架构中的作用和功能。
  • 算法之常见八大排序