问题根源:为什么会出现乱码?
wordcloud 库在绘制文字时,本身并不包含字体文件,它依赖于你系统中的字体文件来渲染文字,当你处理中文时,如果你的 Python 环境找不到一个包含中文字符的字体文件,它就会默认使用一个不包含中文字符的英文字体(如 Arial, Times New Roman),结果就是方框、问号或者完全无法显示,也就是我们常说的“乱码”。

解决方案
核心思路是:提供一个支持中文的字体文件给 WordCloud 使用。
使用系统中自带的字体(最常用、推荐)
这是最简单直接的方法,因为不需要额外下载文件,绝大多数 Windows 和 macOS 系统都自带了支持中文的字体。
找到一个中文字体文件的路径
你需要知道你系统中某个中文字体(如“微软雅黑”、“SimHei”、“宋体”)的 .ttf 文件存放位置。

-
Windows 系统:
- “微软雅黑” (Microsoft YaHei):
C:\Windows\Fonts\msyh.ttc或C:\Windows\Fonts\msyh.ttf - “黑体” (SimHei):
C:\Windows\Fonts\simhei.ttf - 你可以通过在文件资源管理器地址栏输入
C:\Windows\Fonts来查看所有字体。
- “微软雅黑” (Microsoft YaHei):
-
macOS 系统:
- “黑体” (Heiti SC):
/System/Library/Fonts/STHeiti Medium.ttc - “苹方” (PingFang SC):
/System/Library/Fonts/Supplemental/PingFang.ttc - 可以使用
Finder->前往->文件夹,然后输入上述路径来访问。
- “黑体” (Heiti SC):
-
Linux 系统 (如 Ubuntu):
- 通常需要先安装中文字体包,
sudo apt-get install fonts-wqy-microhei或sudo apt-get install fonts-wqy-zenhei。 - 安装后,字体文件通常在
/usr/share/fonts/目录下,/usr/share/fonts/truetype/wqy/wqy-microhei.ttc。
- 通常需要先安装中文字体包,
在代码中指定字体路径

找到字体路径后,在创建 WordCloud 对象时,通过 font_path 参数传入。
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 1. 准备文本(这里用一段示例中文文本)
text = """
Python是一种广泛使用的解释型、高级和通用的编程语言。
Python的设计哲学强调代码的可读性,其语法清晰明了。
它支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。
Python的标准库非常庞大,被称为“自带电池”。
"""
# 2. 使用 jieba 进行中文分词
# wordcloud 本身不支持直接分词,需要先处理好
words = jieba.lcut(text)
text_processed = " ".join(words)
# 3. 创建 WordCloud 对象,并指定中文字体路径
# !!! 这是关键步骤 !!!
# 将下面的路径替换为你自己电脑上的中文字体路径
font_path = "C:/Windows/Fonts/msyh.ttf" # Windows 微软雅黑
# font_path = "/System/Library/Fonts/STHeiti Medium.ttc" # macOS 黑体
# font_path = "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc" # Linux 文泉驿微米黑
wc = WordCloud(
font_path=font_path, # 指定中文字体
width=800,
height=600,
background_color="white"
)
# 4. 生成词云
wc.generate(text_processed)
# 5. 显示词云
plt.figure(figsize=(10, 8))
plt.imshow(wc, interpolation="bilinear")
plt.axis("off") # 关闭坐标轴
plt.show()
运行这段代码,如果字体路径正确,就能正常显示中文词云了。
下载并使用自定义字体(推荐给需要特定风格的情况)
如果你对系统自带的字体不满意,或者你的系统(如某些 Linux 发行版或 Docker 容器)没有中文字体,你可以从网上下载一个。
下载字体文件
从可靠的网站下载一个 .ttf 或 .ttc 格式的中文字体文件。
将字体文件放在你的项目目录下
为了方便管理,建议将下载的字体文件(SourceHanSansSC-Regular.otf)和你的 Python 脚本放在同一个文件夹里。
在代码中指定相对路径
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# ... (文本准备和分词代码同上) ...
# 假设你下载的字体文件 'SourceHanSansSC-Regular.otf' 和脚本在同一目录
font_path = "SourceHanSansSC-Regular.otf"
wc = WordCloud(
font_path=font_path,
width=800,
height=600,
background_color="white"
)
# ... (生成和显示词云代码同上) ...
排查其他可能导致乱码的问题
如果指定了字体路径仍然乱码,可以检查以下几点:
确保分词后的文本是字符串
WordCloud.generate() 方法需要一个字符串作为输入,如果你分词后得到的是列表,必须先用 " ".join() 将其合并成字符串。
# 错误示范
words = jieba.lcut("我爱北京天安门")
wc.generate(words) # words 是列表,会报错或乱码
# 正确示范
text_str = " ".join(words)
wc.generate(text_str)
检查文本编码
虽然 Python 3 默认使用 UTF-8 编码,但在读取外部文件(如 txt, csv)时,如果文件编码不是 UTF-8,也可能出现问题,建议在读取文件时明确指定编码。
# 从文件读取文本时
with open("my_text.txt", "r", encoding="utf-8") as f:
text = f.read()
确保字体文件确实包含你需要显示的字符
有些字体可能只包含简体中文,不包含繁体中文或某些生僻字,如果你的文本里有这些字符,即使字体路径正确,也可能显示为方框。
总结与快速排查清单
遇到 wordcloud 中文乱码,请按以下步骤操作:
- 首要任务:在代码中找到
WordCloud(...)的创建部分,添加或修改font_path参数。 - 找到字体:从你的系统中找到一个中文字体(如微软雅黑、SimHei)的完整路径。
- Windows:
C:\Windows\Fonts\ - macOS:
/System/Library/Fonts/
- Windows:
- 填入路径:将找到的路径(
C:/Windows/Fonts/msyh.ttf)赋值给font_path。 - 检查分词:确保
wc.generate()的输入是一个用空格连接好的长字符串。 - 运行:重新运行你的 Python 脚本。
对于 95% 以上的情况,方案一就能解决问题,祝你编码顺利!
