本次我们先尝试一下更长的文本,这次用《天龙八部》的全本形成词云。经过下面这一串虚词的过滤,我们得到了全文出现最多的人物,按词云排序是段誉>虚竹>萧峰>乔峰>慕容复、王语嫣
stopwords={'的','了','是','在','有','就是','中','这个','它','也','上','已经','被','与','他','可以','着','都','和','个','而','便','又','她','我','自己','却','将','但','你','那','说','要','这','一个','见','来','不','说道','去','人','已','向','给','得','就','想','听','出来','到','什么','瞧','只','对','不是','跟'}
我们也可以尝试用西游记来看一下词云,尝试后发现都需要对文本内部分词汇进行筛除,但首次运行的结果往往也有可取之处。
加轮廓线
下图为尼罗河上的惨案的词云,这次我们在词云外加了轮廓,但是轮廓效果不是很好。翻看了一下别人的经验要图小一些才相对好一点。
stopwords={'said','S','Yes','one','got','will','the','a','and','you','to','she','her','that','of','he','it','I','was','is','with','but','in','all','have','for','on','not','as'}
加轮廓代码如下,主要是在WordCloud(contour_width=1,contour_color='steelblue')添加了contour命令:
import wordcloud
import imageio
string = open('尼罗河上的惨案.txt',encoding='utf-8').read()
mk = imageio.v2.imread('white cat.jpg')
stopwords={'said','S','Yes','one','got','will','the','a','and','you','to','she','her','that','of','he','it','I','was','is','with','but','in','all','have','for','on','not','as'}
w = wordcloud.WordCloud(background_color='white',
font_path='msyh.ttc',
stopwords=stopwords,
mask=mk,
scale=0.5
contour_width=1,
contour_color='steelblue')
w.generate(string)
w.to_file('output3-sentenceA2.png')
根据图片形状+颜色映射词云
终于回到正题,让我们来尝试根据图片形状+颜色映射词云。源代码如下:
import matplotlib.pyplot as plt
from wordcloud import WordCloud,ImageColorGenerator
import imageio
text = open('封神演义.txt',encoding='utf-8').read()
mk = imageio.v2.imread('nz.jpg')
stopwords={'的','了','是','在','有','就是','中','这个','它','也','上','已经','被','与','他','可以','着','都','和','个','而','便','又','她','我','自己','却','将','但','你','那','说','要','这','一个','见','来','不','说道','去','人','已','向','给','得','就','想','听','出来','到','什么','瞧','只','对','不是','跟','不一时','怎见得','但见','有诗为证','诗曰','口称'}
w =WordCloud(background_color='white',
font_path='msyh.ttc',
stopwords=stopwords,
mask=mk,
scale=15)
w.generate(text)
image_colors = ImageColorGenerator(mk)
fig, axes = plt.subplots(1, 3)
axes[0].imshow(w)
axes[1].imshow(w.recolor(color_func=image_colors), interpolation="bilinear")
axes[2].imshow(mk)
for ax in axes:
ax.set_axis_off()
plt.show()
w_color.to_file('output4.jpg')
可得运行结果:
代码解读:
from wordcloud import WordCloud, ImageColorGenerator
从 wordcloud
库中导入了两个类:WordCloud
和 ImageColorGenerator。
WordCloud
类创建词云对象,ImageColorGenerator
类从图像中提取颜色信息
image_colors = ImageColorGenerator(mk)
从图像中提取颜色信息
这一段代码有点熟悉,这里用到了把3个图合并在一起显示的办法。
fig, axes = plt.subplots(1, 3)
axes[0].imshow(w)
axes[1].imshow(w.recolor(color_func=image_colors), interpolation="bilinear")
axes[2].imshow(mk)
for ax in axes:
ax.set_axis_off()
plt.show()
之前我们学过,复习一下:建筑兔零基础自学python记录4|将多条函数图分解为几个图-CSDN博客
我们再来拓展一下之前见过imshow()的用法:
(1)imshow()
X
:必选参数,代表要显示的图像数据。cmap=None
:可选参数,用于指定颜色映射(colormap)。当显示的图像是灰度图像(二维数组)时,可以通过该参数指定不同的颜色映射方案,如'gray'
表示灰度映射。(注:颜色表达时需要用' '单引号,如cmap='gray'
)interpolation=None
:可选参数,用于指定图像的插值方法。aspect=None
:可选参数,用于设置图像的纵横比。'equal'
表示保持图像的原始纵横比。origin=None
:可选参数,用于指定图像的原点位置。可以是'upper'
(默认值,表示原点在图像的左上角)或'lower'
(表示原点在图像的左下角)。
(2)imshow
函数图像的插值方法
fig, axes = plt.subplots(1, 3)
axes[0].imshow(w)
axes[1].imshow(w.recolor(color_func=image_colors), interpolation="bilinear")
axes[2].imshow(mk)
interpolation="bilinear"
是在使用 matplotlib
库的 imshow
函数显示图像时的一个参数设置。interpolation
参数用于指定图像的插值方法,即当图像被缩放显示时,如何处理像素之间的过渡。"bilinear"
:这是一种插值方法,称为双线性插值。双线性插值通过对相邻像素进行加权平均来计算新像素的值,能够在图像缩放时提供相对平滑的过渡效果,使图像看起来更加自然,减少锯齿状边缘,提高图像显示的质量。
可以看到这一段代码是要画1行3列图:
- 图1是w,也就是按照默认颜色生成的黄绿词云
- 图2要按照给定图片颜色,线性插值放缩
- 图3显示原图
(3)关闭 axes
数组中所有子图的坐标轴显示
for ax in axes:
ax.set_axis_off()
for
循环,其主要功能是关闭 axes
数组中所有子图的坐标轴显示。在使用 matplotlib
库绘制多个子图时,默认情况下每个子图都会显示坐标轴,包括刻度线、刻度标签和坐标轴边框等。
如果没有关闭坐标轴则会显示为:
整段代码解释:
import matplotlib.pyplot as plt
#导入两个类WordCloud类创建词云对象,ImageColorGenerator类从图像中提取颜色信息
from wordcloud import WordCloud,ImageColorGenerator
import imageio
text = open('封神演义.txt',encoding='utf-8').read()
mk = imageio.v2.imread('sgb.jpg')
stopwords={'的','了','是','在','有','就是','中','这个','它','也','上','已经','被','与','他','可以','着','都','和','个','而','便','又','她','我','自己','却','将','但','你','那','说','要','这','一个','见','来','不','说道','去','人','已','向','给','得','就','想','听','出来','到','什么','瞧','只','对','不是','跟','不一时','怎见得','但见','有诗为证','诗曰','口称'}
w =WordCloud(background_color='white',
font_path='msyh.ttc',
stopwords=stopwords,
mask=mk,
scale=15)
w.generate(text)
#从图像中提取颜色信息
image_colors = ImageColorGenerator(mk)
#创建1行3列图
fig, axes = plt.subplots(1, 3)
#图1为默认显示词云
axes[0].imshow(w)
#图2为图片颜色词云,双线性插值放缩
axes[1].imshow(w.recolor(color_func=image_colors), interpolation="bilinear")
#显示原图
axes[2].imshow(mk)
#关闭默认坐标轴显示
for ax in axes:
ax.set_axis_off()
plt.show()
w_color.to_file('output5.jpg')
(4)总结:
from wordcloud import WordCloud, ImageColorGenerator
image_colors = ImageColorGenerator(mk)
从 wordcloud
库中导入了两个类:WordCloud
类创建词云对象,ImageColorGenerator
类从图像中提取颜色信息
imshow(cmap='gray',
interpolation='bilinear')
关闭 axes
数组中所有子图的坐标轴显示
for ax in axes:
ax.set_axis_off()
应用:我们再尝试几个词云:
大家一起来试试吧~