本文中的所有示例代码及素材均在 github 项目「shijiu_wordcloud」的 wordcloud2 文件夹中。
python词云模块的安装
制作词云的主要模块为 wordcloud
,另外,要使用 jieba
库切割中文句子,用 imageio
读入图片。在命令行中执行以下命令即可安装:
pip install wordcloud jieba imageio
制作图片状词云
关键点在于利用
- 利用
imageio.imread()
读入图片内容 - 设置 WordCloud 的
mask
参数
# example1.py
from wordcloud import WordCloud
# 导入 imageio 模块的 imread 函数来读取图片内容
from imageio import imread
# 读取图片内容
mk = imread('素材\\五角星.png')
# 设置 mask 参数以获得图片状词云。另外,设置了 repeat 参数使得一个词重复显示以填满图片
wc = WordCloud(background_color='white', repeat=True, mask=mk)
wc.generate('star')
wc.to_file('词云输出\\mask.png')
值得注意的是,如果图片背景不是白色或者透明,则依然会有文字填充。
勾勒图片轮廓
勾勒图片轮廓只需通过 contour_width
参数设置轮廓线宽度,contour_color
参数设置轮廓线颜色。
# example2.py
from wordcloud import WordCloud
from imageio import imread
import matplotlib.pyplot as plt
mk = imread('素材\\belle.png')
# 设置 contour_width 及 contour_width
wc = WordCloud(background_color='white',
scale=10,
repeat=True,
mask=mk,
contour_width=6,
contour_color='goldenrod')
wc.generate('star')
# 使用 matplotlib.pyplot 绘制词云和素材的对比图
fig, axes = plt.subplots(1, 2)
axes[0].imshow(wc)
axes[1].imshow(mk)
for ax in axes:
ax.set_axis_off()
# 保存图片,设置分辨率 dpi=300
plt.savefig('词云输出\\profile.png', dpi=300, bbox_inches='tight')
按图片颜色给文字着色
需要先将图片传入 ImageColorGenerator
类,获取返回的颜色函数,再将此函数传入 WordCloud 的 recolor
属性:
# example3.py
from wordcloud import WordCloud, ImageColorGenerator
from imageio import imread
mk = imread('素材\\belle.png')
# 获取颜色函数
image_colors = ImageColorGenerator(mk)
# 将颜色函数 image_colors 传给 recolor
wc = WordCloud(background_color='white',
scale=10,
color_func=image_colors,
repeat=True,
mask=mk)
wc.generate('star')
wc.to_file('词云输出\\recolor.png')
下面的例子用于对比用图片颜色着色与默认着色效果。在创建 WordCloud 对象时,没有传颜色函数给 color_func
,而是在后面调用 WordCloud 对象的 recolor()
方法传入颜色函数:
# example4.py
from wordcloud import WordCloud, ImageColorGenerator
from imageio import imread
import matplotlib.pyplot as plt
mk = imread('素材\\belle.png')
wc = WordCloud(background_color='white',
scale=20,
repeat=True,
mask=mk)
wc.generate('star')
# 利用 ImageColorGenerator 类生成颜色函数
image_colors = ImageColorGenerator(mk)
fig, axes = plt.subplots(1, 3)
# 显示使用默认着色方案的词云
axes[0].imshow(wc, interpolation="bilinear")
# 用 WordCloud 的 recolor 方法根据图片颜色重新给文字上色
axes[1].imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
# 显示原图片
axes[2].imshow(mk, cmap=plt.cm.gray, interpolation="bilinear")
for ax in axes:
ax.set_axis_off()
plt.savefig('词云输出\\recolor2.png', dpi=300, bbox_inches='tight')
指定特定词的颜色
下面代码中,构建了 GroupedColorFunc 类,利用该类产生颜色函数。
构建了一个 color_to_words 字典,键名为颜色,键值是显示为该颜色的词的列表。读者只需修改此字典即可更改词的颜色。
将字典及默认颜色传入 GroupedColorFunc 类创建该类的实例,再将此实例传入 WordCloud 对象的 recolor
方法即可。
# example5
# 此段代码修改自文末的官方文档中的示例
from wordcloud import WordCloud, get_single_color_func
# 创建 GroupedColorFunc 类,用于产生颜色函数
class GroupedColorFunc(object):
def __init__(self, color_to_words, default_color):
self.color_func_to_words = [
(get_single_color_func(color), set(words))
for (color, words) in color_to_words.items()]
self.default_color_func = get_single_color_func(default_color)
def get_color_func(self, word):
"""Returns a single_color_func associated with the word"""
try:
color_func = next(
color_func for (color_func, words) in self.color_func_to_words
if word in words)
except StopIteration:
color_func = self.default_color_func
return color_func
def __call__(self, word, **kwargs):
return self.get_color_func(word)(word, **kwargs)
# 从文件中读入文本
with open('素材\\text.txt', 'r') as f:
text = f.read()
f.close()
wc = WordCloud(background_color='white', scale=10)
wc.generate(text)
# 创建颜色字典,指定词的颜色。读者可更改颜色、词的列表、添加新颜色、删除颜色等
color_to_words = {
# 下面列表中的词显示为 orangered 颜色
'orangered': ['beautiful', 'explicit', 'simple', 'sparse',
'readability', 'rules', 'practicality',
'explicitly', 'one', 'now', 'easy', 'obvious', 'better'],
# 面列表中的词显示为 blue 颜色
'blue': ['ugly', 'implicit', 'complex', 'complicated', 'nested',
'dense', 'special', 'errors', 'silently', 'ambiguity',
'guess', 'hard']
}
# 设置不在字典中的词的颜色
default_color = 'aquamarine'
# 将字典及默认颜色传入以创建 GroupedColorFunc 实例
grouped_color_func = GroupedColorFunc(color_to_words, default_color)
# 将 GroupedColorFunc 实例传入 recolor 方法以按指定规则着色
wc.recolor(color_func=grouped_color_func)
wc.to_file('词云输出\\group.png')
至此,你已经是python词云能手了,快去创作自己的词云吧!
相关阅读: 「python词云入门」 「python安装详细教程」
参考资料
- 官方文档:「WordCloud for Python documentation」
- b站:「词云可视化:四行Python代码轻松上手到精通」
- github:「amueller/word_cloud」