上述错误表明 matplotlib 无法找到你指定的中文字体(如 WenQuanYi Micro Hei)。这通常是由于字体未正确安装、字体名称不匹配或 matplotlib 的字体缓存问题导致的。以下是详细的排查和解决方法:
步骤 1:确认字体是否已正确安装
运行以下命令,检查系统中是否安装了 WenQuanYi Micro Hei 字体:
fc-list :lang=zh | grep "WenQuanYi Micro Hei"如果没有任何输出,说明该字体未正确安装。
安装 WenQuanYi Micro Hei 字体
如果字体未安装,可以通过以下命令安装:
sudo apt update
sudo apt install fonts-wqy-microhei安装完成后,再次运行以下命令验证:
fc-list :lang=zh | grep "WenQuanYi Micro Hei"你应该会看到类似以下输出:
/usr/share/fonts/truetype/wqy/wqy-microhei.ttc: WenQuanYi Micro Hei:style=Regular
步骤 2:确认字体名称是否正确
matplotlib 使用的字体名称必须与 fc-list 输出的名称完全一致。例如,fc-list 显示的字体名称是 WenQuanYi Micro Hei,而不是 Micro Hei 或其他变体。
你可以通过以下代码列出 matplotlib 可用的字体:
from matplotlib import font_manager
# 列出所有可用字体
for font in font_manager.findSystemFonts(fontpaths=None, fontext='ttf'):
print(font_manager.FontProperties(fname=font).get_name())在输出中查找 WenQuanYi Micro Hei,确保其名称与 plt.rcParams['font.sans-serif'] 中的名称一致。
步骤 3:清除 matplotlib 字体缓存
有时,matplotlib 的字体缓存可能导致字体未正确加载。按照以下步骤清除缓存:
-
找到
matplotlib的缓存目录:import matplotlib print(matplotlib.get_cachedir())输出可能是类似
/home/用户名/.cache/matplotlib的路径。 -
删除缓存文件:
rm -rf /home/用户名/.cache/matplotlib/*
步骤 4:更新代码中的字体配置
确保代码中的字体配置正确无误。以下是更新后的完整代码示例:
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.font_manager import FontProperties
# 配置中文字体
plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei', 'Noto Sans CJK SC', 'SimHei', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 绘制 road_with_landuse 地图
fig, ax = plt.subplots(1, figsize=(12, 10))
# 根据 Landuse_Type 字段着色
road_with_landuse.plot(column='Landuse_Type', cmap='tab20', legend=True,
legend_kwds={'title': '土地利用类型', 'prop': {'family': 'WenQuanYi Micro Hei'}}, ax=ax)
# 设置标题和坐标轴标签(使用中文)
ax.set_title('道路网络与土地利用属性', fontsize=16)
ax.set_xlabel('经度', fontsize=12)
ax.set_ylabel('纬度', fontsize=12)
# 显示地图
plt.tight_layout()
plt.show()步骤 5:测试其他字体
如果 WenQuanYi Micro Hei 仍然不可用,可以尝试其他中文字体。例如,安装并使用 Noto Sans CJK:
sudo apt install fonts-noto-cjk然后将代码中的字体列表更新为:
plt.rcParams['font.sans-serif'] = ['Noto Sans CJK SC', 'WenQuanYi Micro Hei', 'SimHei', 'Arial Unicode MS']步骤 6:手动指定字体路径
如果上述方法仍无法解决问题,可以直接指定字体文件的路径。例如:
from matplotlib import font_manager
# 指定字体文件路径
font_path = "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc" # 替换为实际路径
font_prop = font_manager.FontProperties(fname=font_path)
# 配置中文字体
plt.rcParams['font.sans-serif'] = [font_prop.get_name()]
plt.rcParams['axes.unicode_minus'] = False
# 测试绘图
plt.text(0.5, 0.5, '测试中文显示', fontproperties=font_prop, fontsize=16)
plt.show()总结
- 确保字体已正确安装,并通过
fc-list验证。 - 确保字体名称与
matplotlib配置一致。 - 清除
matplotlib的字体缓存。 - 如果问题仍未解决,可以手动指定字体路径。
完成上述步骤后,应该能够解决 findfont 错误并成功显示中文。如果仍有问题,请提供更多信息(如 fc-list 输出结果),以便进一步排查!