Python⼀键⽣成漂亮的⽣⽇快乐词云
⼤家好,我是涛哥。
最近遇到许多朋友有特殊的需求,他们只想把 【名字】和【⽣⽇快乐】两个词组在⼀起,祝他⼈⽣⽇快乐,不想弄太复杂的东西,所以今天我们就来说说如何⽤这么少的词汇⽣成漂亮的词云。
1.准备
开始之前,你要确保Python和pip已经成功安装在电脑上
请选择以下任⼀种⽅式输⼊命令安装依赖:
1. Windows 环境 打开 Cmd (开始-运⾏-CMD)。
2. MacOS 环境 打开 Terminal (command+空格输⼊Terminal)。
3. 如果你⽤的是 VSCode编辑器 或 Pycharm,可以直接使⽤界⾯下⽅的Terminal.
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 -
如果你不想折腾代码,安装完依赖后,输⼊以下命令就可以⽣成你的词云:
python birthday.py 图⽚位置对象姓名
如:
python birthday.py example.png ⽇常学python
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='f'
).generate_from_frequencies(words)
⽣成词云并渲染:
# ⽣成词云
bimgColors = ImageColorGenerator(bimg)
# 渲染词云
plt.axis("off")
plt.lor(color_func=bimgColors))
plt.savefig(name+'.png')
plt.show()
完整代码如下:
# coding:utf-8
# ⽇常学Python
# 2021/09/15
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='f'
).generate_from_frequencies(words)
# ⽣成词云
bimgColors = ImageColorGenerator(bimg)
# 渲染词云
plt.axis("off")
plt.lor(color_func=bimgColors))
plt.savefig(name+'.png')
plt.show()
fire.Fire(gen_happy_birthday_cloud)
3.整合⼀句运⾏
接下来,我们使⽤上次提到的 ⼀⾏命令实现功能 将这个功能打包成输⼊命令就能运⾏的程序,⽐如: python birthday.py 图⽚⽇常学python
嘛,在完整代码最后⾯加⼀⾏语句就⾏了:
import fire
fire.Fire(gen_happy_birthday_cloud)
当然,别忘了还要import fire模块。
最后实验⼀下:
python birthday.py example.png ⽇常学python
怎么样,效果不错吧?喜欢的话记得点⼀个在看哦!
如果你喜欢今天的Python 教程,请持续关注⽇常学Python,如果对你有帮助,⿇烦在下⾯点⼀个赞/在看,有任何问题都可以在下⽅留⾔,我们会耐⼼解答的!
好了,今天的学习就到这⾥,如果⼤家希望深度学习的话,可以加⼊我的社,与900多位同学⼀起学
习;
往期⽂章
50条有趣的Python⼀⾏代码,建议收藏!