建筑兔零基础自学python记录27|实战词云可视化项目——图片形状+颜色映射5

本次我们先尝试一下更长的文本,这次用《天龙八部》的全本形成词云。经过下面这一串虚词的过滤,我们得到了全文出现最多的人物,按词云排序是段誉>虚竹>萧峰>乔峰>慕容复、王语嫣

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 库中导入了两个类:WordCloudImageColorGenerator。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" 是在使用 matplotlibimshow 函数显示图像时的一个参数设置。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()

    应用:我们再尝试几个词云:

     大家一起来试试吧~

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值