适用于 Windows、macOS、Linux 全平台,中文显示不再是方块!
📌 场景介绍
上篇文章里,带大家写了个简单的量化投资Python小脚本,
实现功能:
-
自动识别股票是否连续上涨
-
建议买入时机
-
绘制清晰的价格变化趋势图
代码回顾:
有粉丝私信我说图表中文显示成了方块“□□□”?
别慌,今天我们逐个击破,一口气把这些乱码通通打回原形!
🧨 遇到常见问题:
❌ 问题一:模块没安装
出现提示:
ModuleNotFoundError: No module named 'matplotlib'
✅ 解决方法:安装 matplotlib 库
如果你还没有安装 matplotlib
,
打开终端 / 命令行,输入:
pip install matplotlib
或在 Jupyter Notebook 中输入并运行:
!pip install matplotlib
❌ 问题二:中文乱码!?
如果你运行后发现标题标签显示成方框“口口口”或乱码,或者图表中文字显示不出来:
✅ 解决方法:手动设置中文字体
matplotlib
默认不支持中文字体,需要手动设置。
在画图脚本前加入这两行:
1)适用于Windows
plt.rcParams['font.sans-serif'] = ['SimHei'] # 黑体,适用于 Windows plt.rcParams['axes.unicode_minus'] = False # 避免负号显示为方块
2)如果你用的是 macOS,可尝试替换字体为:
plt.rcParams['font.sans-serif'] = ['Heiti SC'] # 或 'PingFang SC'
❌ 问题三:仍然中文乱码!?
图表中文仍然显示为方框(口口口),说明你的系统中根本没有这两种字体,或者 matplotlib
没识别到。
✅ 解决方法:找出你电脑已有的中文字体并指定(动态字体名法)
动态列出你系统中所有字体,挑一个确实存在的中文字体来用。
1️⃣ 步骤一:找出所有已安装字体
运行以下代码,列出你电脑上安装的所有字体名。
import matplotlib.font_manager as fm
for font in fm.findSystemFonts(fontpaths=None, fontext='ttf'):
font_name = fm.FontProperties(fname=font).get_name()
print(font_name)
请在输出中找一个明显支持中文的字体名,比如这些:
-
思源黑体(
Noto Sans CJK SC
或Source Han Sans SC
) -
微软雅黑(
Microsoft YaHei
) -
PingFang SC
-
苹方
-
仿宋、宋体 等等
2️⃣ 步骤二:把找到的字体设置为中文字体
比如你发现有 Microsoft YaHei
,就这样设置:
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
或者:
plt.rcParams['font.sans-serif'] = ['Noto Sans CJK SC']
然后加上这句避免负号乱码:
plt.rcParams['axes.unicode_minus'] = False
📓 示例完整代码(动态字体名法)
import matplotlib.pyplot as plt
# 设置字体(你替换为你系统里有的中文字体名)
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 举例
plt.rcParams['axes.unicode_minus'] = False
prices = [100, 101, 103, 102, 104, 106, 107]
days = list(range(1, len(prices) + 1))
plt.plot(days, prices, marker='o', label='股价')
plt.title("股票价格变化图")
plt.xlabel("日期")
plt.ylabel("价格(元)")
plt.grid(True)
plt.legend()
plt.show()
❌ 问题四:还是不行?
执行上述完整代码后,仍出现报错:
RuntimeError: Could not set the fontsize (invalid pixel size; error code 0x17)
说明你指定的字体文件或字体名称存在问题,比如:
-
字体文件本身有问题(损坏或不支持)
-
matplotlib
解析时失败 -
字体名不规范或不被系统识别
✅ 解决思路:
1️⃣ 步骤一:重置字体设置试试是否画图正常
先测试以下初始配置代码,完全不设置中文字体,看是否能画图(但可能中文仍是乱码):
import matplotlib.pyplot as plt
prices = [100, 101, 103, 102, 104, 106, 107]
days = list(range(1, len(prices) + 1))
plt.plot(days, prices, marker='o', label='股价')
plt.title("股票价格变化图")
plt.xlabel("日期")
plt.ylabel("价格(元)")
plt.grid(True)
plt.legend()
plt.show()
如果这段代码能正常弹出图,只是中文乱码,说明问题确实出在字体设置。
2️⃣ 步骤二:用本地字体路径直接指定字体文件(推荐做法)
📌 首先,找到你系统中字体文件路径
1)在 macOS 上:
查看路径:
/System/Library/Fonts/
或 /System/Library/Fonts/Supplemental/
找字体,如 PingFang.ttc
或在终端输入:
ls /System/Library/Fonts/
你可能看到这些:
-
PingFang.ttc
-
AppleGothic.ttf
2)在 Windows 上:
查看路径:
C:\Windows\Fonts
拷贝某个字体文件的完整路径,例如:
C:\Windows\Fonts\simhei.ttf
📌 然后,写进代码里:
my_font = FontProperties(fname="C:/Windows/Fonts/simhei.ttf")
📓 示例完整代码
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
# 手动加载字体文件(你要用自己电脑上实际存在的 .ttf 文件)
my_font = FontProperties(fname="/System/Library/Fonts/PingFang.ttc") # macOS 举例
# 图表内容
prices = [100, 101, 103, 102, 104, 106, 107]
days = list(range(1, len(prices) + 1))
plt.plot(days, prices, marker='o', label='股价')
plt.title("股票价格变化图", fontproperties=my_font)
plt.xlabel("日期", fontproperties=my_font)
plt.ylabel("价格(元)", fontproperties=my_font)
plt.grid(True)
plt.legend(prop=my_font)
plt.show()
注释:
细心的小伙伴一定注意到新增了这一行代码:
from matplotlib.font_manager import FontProperties
它的作用是:是从 matplotlib
中导入 FontProperties
类,用它来加载和使用本地字体文件(.ttf 或 .ttc)。
🔍 如果不加这句会怎样?
如果你不导入 FontProperties
,直接写这句:
my_font = FontProperties(fname="某某字体路径")
Python 就会提示:
NameError: name 'FontProperties' is not defined
因为你没有告诉 Python “FontProperties 是谁”。
📍 终极方案:换默认英文字体、不显示中文(下下策)
万一你是那个 0.01% 的“字体受害者”,上面的方法都不灵……
我也只能掏出压箱底的终极秘笈了——真的不想用这招,但它从没失手。
如果只是测试用途,不显示中文也可以这么写:
plt.title("Stock Trend")
plt.xlabel("Day")
plt.ylabel("Price (Yuan)")
✅ 效果图(示意):
图中会显示7个点的股价走向,横轴是“日期”,纵轴是“价格(元)”,曲线平滑、有标记点,标题和标签中文都能正确显示。
🧠 总结一句话:
用 Python + matplotlib 不仅可以进行基础的数据判断(例如判断买入机会),还可以高质量地绘制趋势图,只要你搞定中文字体的问题,就能做出专业感十足的图表!