Windows环境下解决Matplotlib中文字体显示问题的详细教程

Written by

in

文章目录
  • 遇到的字体显示问题,我将为您详细介绍如何在Windows系统下配置Matplotlib以正确显示中文,并提供完整的解决方案。
  • 常见的中文字体显示问题包括: 中文字符显示为方框 报错:UserWarning: findfont: Font family 'SimHei' not found 图表标题或标签乱码
  • 运行以下代码验证字体配置是否成功: import matplotlib.pyplot as plt import numpy as np def create_test_chart(): # 准备数据 x = np.linspace(0, 10, 100) y = np.sin(x) # 创建图表 plt.figure(figsize=(10, 6)) plt.plot(x, y, label=”正弦曲线”) # 添加中文标签和标题 plt.title(“Matplotlib 中文支持测试图表”) plt.xlabel(“X轴标签示例”) plt.ylabel(“Y轴标签示例”) plt.legend() # 显示网格 plt.grid(True) # 显示图表 plt.show() if __name__ == “__main__”: create_test_chart()
  • 目录
    • 引言
    • 问题分析
    • 解决方案详解
      • 1. 检查系统已安装字体
      • 2. 手动添加中文字体(以SimHei为例)
        • 步骤 1: 安装字体
        • 步骤 2: 更新Matplotlib字体缓存
      • 3. 配置Matplotlib使用中文字体
        • 4. 修改Matplotlib配置文件(永久生效)
          • 5. 高级配置(支持更多字体)
          • 常见问题及解决方法
            • 问题1:字体显示为英文
              • 问题2:中文部分字符显示正常,部分显示异常
                • 问题3:Linux与Windows跨平台显示不一致
                • 验证步骤
                  • 高级技巧
                    • 1. 动态字体选择(根据系统环境自动适配)
                      • 2. 字体回退机制

                      遇到的字体显示问题,我将为您详细介绍如何在Windows系统下配置Matplotlib以正确显示中文,并提供完整的解决方案。

                      常见的中文字体显示问题包括:

                      1. 中文字符显示为方框
                      2. 报错:UserWarning: findfont: Font family 'SimHei' not found
                      3. 图表标题或标签乱码

                      首先,我们需要确认系统中已安装的中文字体:

                      import matplotlib.pyplot as plt
                      import matplotlib
                      
                      # 显示当前Matplotlib使用的字体目录
                      print("字体缓存目录:", matplotlib.get_cachedir())
                      print("字体配置文件路径:", matplotlib.matplotlib_fname())
                      
                      # 列出所有可用字体
                      from matplotlib.font_manager import fontManager
                      
                      for font in fontManager.ttflist:
                          if 'simhei' in font.name.lower() or 'ming' in font.name.lower() or 'kai' in font.name.lower():
                              print(f"字体名称: {font.name}, 路径: {font.fname}")
                      

                      如果未找到中文字体,请按照以下步骤操作:

                      1. 从网上下载SimHei字体(黑体)文件 simhei.ttf
                      2. 右键点击字体文件 -> 为所有用户安装

                      import matplotlib.pyplot as plt
                      import shutil
                      import matplotlib
                      
                      # 获取Matplotlib字体目录
                      font_dir = matplotlib.get_data_path() + "\fonts\ttf"
                      
                      # 复制字体文件到Matplotlib字体目录(假设字体文件在C:WindowsFontssimhei.ttf)
                      shutil.copy("C:\Windows\Fonts\simhei.ttf", font_dir)
                      
                      # 清除字体缓存
                      from matplotlib.font_manager import _rebuild
                      _rebuild()
                      

                      创建一个Python脚本,内容如下:

                      import matplotlib.pyplot as plt
                      from matplotlib.font_manager import FontProperties
                      
                      # 设置中文字体和解决负号显示问题
                      plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'FangSong']  # 使用黑体和微软雅黑
                      plt.rcParams['axes.unicode_minus'] = False  # 解决负号-显示为方块的问题
                      
                      # 测试绘图
                      def test_chinese_font():
                          plt.figure(figsize=(8, 4))
                          plt.text(0.5, 0.5, '你好,世界!Hello, 世界!', 
                                   fontsize=24, ha='center', va='center')
                          plt.axis('off')
                          plt.title('中文字体显示测试')
                          plt.show()
                      
                      if __name__ == "__main__":
                          test_chinese_font()
                      

                      1. 找到配置文件路径:
                      import matplotlib
                      print(matplotlib.matplotlib_fname())
                      

                      通常输出为:C:Python39libsite-packagesmatplotlibmpl-datamatplotlibrc

                      1. 编辑该文件,修改以下几行:
                      font.family         : sans-serif
                      font.sans-serif     : SimHei, Microsoft YaHei, DejaVu Sans, Bitstream Vera Sans, ... sans-serif
                      axes.unicode_minus  : False
                      
                      1. 清除缓存:
                      import matplotlib.pyplot as plt
                      from matplotlib.font_manager import _rebuild
                      
                      _rebuild()  # 清除字体缓存
                      

                      import matplotlib.pyplot as plt
                      from matplotlib.font_manager import FontProperties
                      
                      # 指定字体路径(适用于字体不在系统路径的情况)
                      font_path = "C:/Windows/Fonts/simhei.ttf"
                      chinese_font = FontProperties(fname=font_path, size=12)
                      
                      # 测试多种字体
                      def test_multiple_fonts():
                          fonts = {
                              'SimHei': '黑体',
                              'Microsoft YaHei': '微软雅黑',
                              'FangSong': '仿宋',
                              'KaiTi': '楷体',
                              'SimSun': '宋体'
                          }
                          
                          plt.figure(figsize=(12, 6))
                          
                          for i, (font_name, chinese_name) in enumerate(fonts.items()):
                              try:
                                  plt.text(0.1, 0.8 - i*0.15, f'{chinese_name}: {font_name}', 
                                          fontproperties=FontProperties(family=font_name),
                                          fontsize=16)
                              except Exception as e:
                                  plt.text(0.1, 0.8 - i*0.15, f'{chinese_name}: {font_name} (加载失败)', 
                                          fontsize=16, color='red')
                          
                          plt.axis('off')
                          plt.title('中文字体测试')
                          plt.show()
                      
                      if __name__ == "__main__":
                          test_multiple_fonts()
                      

                      原因:Matplotlib未找到合适的中文字体 解决

                      1. 确认字体已安装
                      2. 检查字体名称是否正确
                      3. 清除字体缓存目录下的所有.cache文件

                      原因:某些字体不包含完整的中文字符集 解决

                      1. 尝试更换字体,如用微软雅黑替代黑体
                      2. 使用思源黑体等更全面的字体
                      3. 确保使用UTF-8编码保存脚本

                      建议做法

                      import platform
                      import matplotlib.pyplot as plt
                      
                      # 根据操作系统自动选择字体
                      if platform.system() == 'Windows':
                          plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei']  # Windows
                      elif platform.system() == 'Linux':
                          plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei', 'Noto Sans CJK']  # Linux
                      else:  # macOS
                          plt.rcParams['font.sans-serif'] = ['PingFang HK', 'Arial Unicode MS']
                      

                      运行以下代码验证字体配置是否成功:

                      import matplotlib.pyplot as plt
                      import numpy as np
                      
                      def create_test_chart():
                          # 准备数据
                          x = np.linspace(0, 10, 100)
                          y = np.sin(x)
                          
                          # 创建图表
                          plt.figure(figsize=(10, 6))
                          plt.plot(x, y, label="正弦曲线")
                          
                          # 添加中文标签和标题
                          plt.title("Matplotlib 中文支持测试图表")
                          plt.xlabel("X轴标签示例")
                          plt.ylabel("Y轴标签示例")
                          plt.legend()
                          
                          # 显示网格
                          plt.grid(True)
                          
                          # 显示图表
                          plt.show()
                      
                      if __name__ == "__main__":
                          create_test_chart()
                      

                      import matplotlib.pyplot as plt
                      import platform
                      
                      def auto_configure_chinese():
                          system = platform.system()
                          
                          if system == 'Windows':
                              # Windows系统常用中文字体
                              fonts = ['Microsoft YaHei', 'SimHei', 'FangSong', 'KaiTi']
                          elif system == 'Linux':
                              # Linux系统常用中文字体(需要安装)
                              fonts = ['WenQuanYi Zen Hei', 'Noto Sans CJK', 'Droid Sans Fallback']
                          else:  # macOS
                              # macOS系统内置中文字体
                              fonts = ['PingFang HK', 'Arial Unicode MS', 'Apple LiGothic Medium']
                          
                          # 设置字体
                          plt.rcParams['font.sans-serif'] = fonts
                          plt.rcParams['axes.unicode_minus'] = False
                      
                      # 在脚本开始处调用此函数
                      auto_configure_chinese()
                      

                      from matplotlib.font_manager import FontProperties, findfont
                      
                      def get_chinese_font(size=12):
                          """获取可用的中文字体"""
                          for font_name in ['Microsoft YaHei', 'SimHei', 'FangSong', 'KaiTi']:
                              try:
                                  return FontProperties(family=font_name, size=size)
                              except Exception:
                                  continue
                          
                          # 如果找不到任何中文字体,返回默认字体
                          return None
                      
                      def safe_plot():
                          font = get_chinese_font()
                          
                          plt.figure(figsize=(8, 4))
                          if font:
                              plt.text(0.5, 0.5, '你好,世界!', 
                                      fontproperties=font, 
                                      fontsize=24, ha='center', va='center')
                          else:
                              plt.text(0.5, 0.5, '警告:未找到中文字体', 
                                      fontsize=24, ha='center', va='center', color='red')
                          
                          plt.axis('off')
                          plt.title('字体检测结果')
                          plt.show()
                      
                      safe_plot()
                      

                      通过以上步骤,您应该能够完全解决Matplotlib在Windows环境下的中文字体显示问题。如果问题仍然存在,请检查字体文件的完整性和系统权限设置。

                      以上就是Windows环境下解决Matplotlib中文字体显示问题的详细教程的详细内容,更多关于Windows Matplotlib中文字体显示问题的资料请关注风君子博客其它相关文章!

                      您可能感兴趣的文章:

                      • windows下vscode环境c++利用matplotlibcpp绘图
                      • Windows下为Python安装Matplotlib模块
                      • Python利用Matplotlib绘图无法显示中文字体的两种解决方案
                      • Python使用matplotlib时显示中文乱码解决方法(或更改字体)
                      • Python利用Matplotlib绘图无法显示中文字体的解决方案

                      站内搜索