pin_drop当前位置:知识文库 ❯ 图文
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系统常用中文字体
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指定字体文件路径。
本文涉及AI创作
内容由AI创作,请仔细甄别