matplotlib图例含Unicode字符触发LaTeX inputenc报错如何解决
matplotlib图例多语言Unicode字符显示解决方案
场景1:不需要LaTeX渲染文本(推荐,最简单)
核心是直接使用matplotlib原生文本渲染,只要配置支持多语言的系统字体即可:
#!/usr/bin/python # -*- coding: utf-8 -*- import matplotlib.pyplot as plt # 关闭LaTeX渲染(如之前未手动开启可省略本行) plt.rcParams['text.usetex'] = False # 配置支持多语言的无衬线字体,优先选覆盖字符集广的字体如Noto系列 plt.rcParams['font.sans-serif'] = ['Noto Sans CJK SC', 'Noto Sans', 'DejaVu Sans'] # 修复负号显示异常问题 plt.rcParams['axes.unicode_minus'] = False plt.plot(0,0, label='foo Д 中文测试') plt.legend() plt.show()
场景2:必须使用LaTeX渲染文本
之前配置失效是因为XeLaTeX原生支持UTF-8,不需要inputenc、fontenc这类面向pdfLaTeX的包,正确配置如下:
#!/usr/bin/python # -*- coding: utf-8 -*- import matplotlib.pyplot as plt plt.rcParams.update({ "text.usetex": True, "pgf.texsystem": "xelatex", "pgf.preamble": "\n".join([ # 加载XeLaTeX字体管理包 r"\usepackage{fontspec}", # 配置主字体,覆盖拉丁文、西里尔文等字符 r"\setmainfont{Noto Sans}", # 加载中文支持包,配置中文字体 r"\usepackage{xeCJK}", r"\setCJKmainfont{Noto Sans CJK SC}", ]), }) plt.plot(0,0, label='foo Д 中文测试') plt.legend() # 可直接保存为PDF/PGF格式,显示完全正常 plt.savefig("multilang_plot.pdf")
注意事项
- 提前在系统中安装用到的字体,Noto系列字体为开源字体,覆盖绝大多数常用Unicode字符,可直接安装使用
- 若仍有个别字符不显示,替换为支持该字符的字体即可
- 无需切换后端即可同时支持所有常用语言字符显示
内容的提问来源于stack exchange,提问作者CPBL
相关产品推荐
相关产品推荐

