1.准备
开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南进行安装。
**(可选1) **如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.
**(可选2) **此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南)。
请选择以下任一种方式输入命令安装依赖 :
pip install wordcloud == 1.5.0
pip install scipy == 1.1.0
pip install multidict == 4.5.2
pip install matplotlib == 2.2.4
pip install fire == 0.2.1
pip install numpy == 1.16.4
看到 Successfully installed xxx 则说明安装成功。或公众号后台回复生日快乐可获得本文全部代码,然后进入文件夹,输入一行命令安装所有依赖:
pip install -r requirements.txt
如果你不想折腾代码,安装完依赖后,输入以下命令就可以生成你的词云:
python birthday.py 图片位置 对象姓名
如:
python birthday.py example.png 宝典哥
2.编写代码
首先是引入词云对象,并初始化【生日快乐】和对方姓名:
words = multidict.MultiDict()
# 生日快乐和姓名的权重必须先初始化两个最大权重的
words.add('生日快乐', 10)
words.add(name, 12)
细心的读者可能发现了,我们在这里用了MultiDict,这主要是因为wordcloud只允许接受【字典】数据结构,而Python内置的字典不允许重复值,所以我们只能引入multidict模块。
然后是插入新的生日快乐词云和对方姓名:
# 随意插入新的词语
for i in range(1000):
words.add('生日', numpy.random.randint(1, 5))
words.add('快乐', numpy.random.randint(1, 5))
words.add(name, numpy.random.randint(1, 5))
然后我们需要对图片进行一些处理,现在网络上的图片很多都包含一些杂色,因此需要把这些杂色去掉:
def transform_format(val):
"""
用于去除杂色
Args:
val (list): RGB颜色组
Returns:
list: 去除杂色后的组
"""
if val[0] > 245 and val[1] > 245 and val[2] > 245:
val[0] = val[1] = val[2] = 255
return val
else:
return val
引入图片,去除杂色:
# 设定图片
bimg = imread(file)
for color in range(len(bimg)):
bimg[color] = list(map(transform_format, bimg[color]))
wordcloud = WordCloud(
background_color='white', mask=bimg,
font_path='simhei.ttf'
).generate_from_frequencies(words)
生成词云并渲染:
# 生成词云
bimgColors = ImageColorGenerator(bimg)
# 渲染词云
plt.axis("off")
plt.imshow(wordcloud.recolor(color_func=bimgColors))
plt.savefig(name+'.png')
plt.show()
完整代码如下:
# coding:utf-8
# Python 实用宝典
# 2021/08/01
import numpy
import fire
import multidict
import matplotlib.pyplot as plt
from scipy.misc import imread
from wordcloud import WordCloud, ImageColorGenerator
def transform_format(val):
"""
用于去除杂色
Args:
val (list): RGB颜色组
Returns:
list: 去除杂色后的组
"""
if val[0] > 245 and val[1] > 245 and val[2] > 245:
val[0] = val[1] = val[2] = 255
return val
else:
return val
def gen_happy_birthday_cloud(file, name):
"""
生成生日快乐词云
Args:
file (str): 词云背景图
name (str)): 对方的姓名
"""
words = multidict.MultiDict()
# 生日快乐和姓名的权重必须先初始化两个最大权重的
words.add('生日快乐', 10)
words.add(name, 12)
# 随意插入新的词语
for i in range(1000):
words.add('生日', numpy.random.randint(1, 5))
words.add('快乐', numpy.random.randint(1, 5))
words.add(name, numpy.random.randint(1, 5))
# 设定图片
bimg = imread(file)
for color in range(len(bimg)):
bimg[color] = list(map(transform_format, bimg[color]))
wordcloud = WordCloud(
background_color='white', mask=bimg,
font_path='simhei.ttf'
).generate_from_frequencies(words)
# 生成词云
bimgColors = ImageColorGenerator(bimg)
# 渲染词云
plt.axis("off")
plt.imshow(wordcloud.recolor(color_func=bimgColors))
plt.savefig(name+'.png')
plt.show()
fire.Fire(gen_happy_birthday_cloud)
3.整合一句运行
接下来,我们使用上次提到的 [一行命令实现功能将这个功能打包成输入命令就能运行的程序,比如:
python birthday.py 图片 宝典哥
嘛,在完整代码最后面加一行语句就行了:
import fire
fire.Fire(gen_happy_birthday_cloud)
当然,别忘了还要import fire模块。
最后实验一下:
python birthday.py example.png 宝典哥
怎么样,效果不错吧?喜欢的话记得点一个在看哦!
全部0条评论
快来发表一下你的评论吧 !