wordcloud 词云制作

本文详细介绍了Python的wordcloud库,用于生成词云。内容涵盖安装、导入、基本步骤、主要方法及参数,如字体、图像、颜色、单词处理等设置,并提供多个示例,包括无图、有图、单词、指定颜色和中文词云的生成。此外,还展示了如何自定义颜色函数和使用matplotlib颜色映射。
摘要由CSDN通过智能技术生成

介绍

python的一个生成词云的第三方库。

安装

会同时安装依赖库numpypillowmatplotlib

pip install wordcloud

导入

import wordcloud

基本步骤

创建一个词云对象(或模板) —— 将文本添加到词云对象生成词云 —— 将词云图片保存到文件( —— 进一步展示词云图片)

(由于内置分词只针对英文,所以当使用汉字生成词云是需结合jieba分词使用)。

想快速开始可直接跳转示例学习

主要方法及参数

wordcloud.WordCloud(**kwargs)

创建词云对象。

参数

  1. 字体(6)

    • font_path=None】:str。

      字体文件(.otf | .ttf | .ttc)路径。默认为None,即使用模块目录下DroidSansMono.ttf字体文件。当绘制中文词云时需更改为中文字体,否则会乱码。

    • min_font_size=4】:int。

      词云中词的最小字体大小。当没有空间时会停止,即不一定会达到最小值,拟合完成即可。

    • max_font_size=None】:int or None。

      词云中词的最大字体大小。默认为None,即图像高度

    • font_step=1】:int。

      字体大小步长。当 >1 时,将加快算法速度,但会降低拟合度。

      每个词的字体大小是根据其在字典中的顺序被依次赋予的。

    • color_func=None】:function or None。

      可传入(word, font_size, position, orientation, font_path, random_state)的颜色函数,可使用匿名函数,用于给词语设置颜色。

      ---源码---
      
      for word, freq in frequencies:
          ...
      	colors.append(self.color_func(word, font_size=font_size,
                                                position=(x, y),
                                                orientation=orientation,
                                                random_state=random_state,
                                                font_path=self.font_path))
          
      self.layout_ = list(zip(frequencies, font_sizes, positions,
                                      orientations, colors))
      

      colormap=None】:str or matplotlib colormap or None。

      color_func!=None时,使用传入的颜色函数,colormap被忽略。

      color_func=None时,将通过colormap调用colormap_color_func(colormap)创建颜色函数用于根据colormap值产生随机颜色。

      colormap=None时:

      matplotlib版本号 < 1.5,则colormap=“hsv”;

      matplotlib版本号 > 1.5,则colormap='viridis'

      colormap传入值时,使用传入值。

      colormap作为str可传入以下参数:

       'Accent', 'Accent_r', 'Blues', 'Blues_r', 'BrBG', 'BrBG_r', 'BuGn', 'BuGn_r', 'BuPu', 'BuPu_r', 'CMRmap', 'CMRmap_r', 'Dark2', 'Dark2_r', 'GnBu', 'GnBu_r', 'Greens', 'Greens_r', 'Greys', 'Greys_r', 'OrRd', 'OrRd_r', 'Oranges', 'Oranges_r', 'PRGn', 'PRGn_r', 'Paired', 'Paired_r', 'Pastel1', 'Pastel1_r', 'Pastel2', 'Pastel2_r', 'PiYG', 'PiYG_r', 'PuBu', 'PuBuGn', 'PuBuGn_r', 'PuBu_r', 'PuOr', 'PuOr_r', 'PuRd', 'PuRd_r', 'Purples', 'Purples_r', 'RdBu', 'RdBu_r', 'RdGy', 'RdGy_r', 'RdPu', 'RdPu_r', 'RdYlBu', 'RdYlBu_r', 'RdYlGn', 'RdYlGn_r', 'Reds', 'Reds_r', 'Set1', 'Set1_r', 'Set2', 'Set2_r', 'Set3', 'Set3_r', 'Spectral', 'Spectral_r', 'Wistia', 'Wistia_r', 'YlGn', 'YlGnBu', 'YlGnBu_r', 'YlGn_r', 'YlOrBr', 'YlOrBr_r', 'YlOrRd', 'YlOrRd_r', 'afmhot', 'afmhot_r', 'autumn', 'autumn_r', 'binary', 'binary_r', 'bone', 'bone_r', 'brg', 'brg_r', 'bwr', 'bwr_r', 'cividis', 'cividis_r', 'cool', 'cool_r', 'coolwarm', 'coolwarm_r', 'copper', 'copper_r', 'cubehelix', 'cubehelix_r', 'flag', 'flag_r', 'gist_earth', 'gist_earth_r', 'gist_gray', 'gist_gray_r', 'gist_heat', 'gist_heat_r', 'gist_ncar', 'gist_ncar_r', 'gist_rainbow', 'gist_rainbow_r', 'gist_stern', 'gist_stern_r', 'gist_yarg', 'gist_yarg_r', 'gnuplot', 'gnuplot2', 'gnuplot2_r', 'gnuplot_r', 'gray', 'gray_r', 'hot', 'hot_r', 'hsv', 'hsv_r', 'inferno', 'inferno_r', 'jet', 'jet_r', 'magma', 'magma_r', 'nipy_spectral', 'nipy_spectral_r', 'ocean', 'ocean_r', 'pink', 'pink_r', 'plasma', 'plasma_r', 'prism', 'prism_r', 'rainbow', 'rainbow_r', 'seismic', 'seismic_r', 'spring', 'spring_r', 'summer', 'summer_r', 'tab10', 'tab10_r', 'tab20', 'tab20_r', 'tab20b', 'tab20b_r', 'tab20c', 'tab20c_r', 'terrain', 'terrain_r', 'turbo', 'turbo_r', 'twilight', 'twilight_r', 'twilight_shifted', 'twilight_shifted_r', 'viridis', 'viridis_r', 'winter', 'winter_r'
      
  2. 图像与画布(9)

    • width=400】:int。

      画布宽度(像素)。

    • height=200】:int。

      画布高度(像素)。

    • mask=None】:nd-array or None。

      指定词云图片二进制掩码,用来将单词画在上面。若指定了图片,widthheight参数将被忽略,以图片数据替代。

      图像中白色将被忽略,而其他颜色将被画上单词。

    • background_color='black'】:color value。

      词云图像的背景颜色

    • mode='RGB'】:str。

      默认“RGB”颜色模式。当mode='RGBA'且未设置背景颜色时,将生成透明背景。

    • contour_width=0】:float。

      图像轮廓宽度。当mask指定了图像,并且contour>0,将绘制图像轮廓。

    • contour_color='black'】:color value。

      图像轮廓颜色

    • scale=1】:float or int。

      等比例缩放倍数

    • relative_scaling='auto'】:float【0~1】。

      根据该参数对词语进行字体大小调整, 使字体大小与frequency有关。

      repeat=True, “auto”=0, 否则"auto"=0.5。

      计算:new_font_size = int(((frequency -1) * relative_scaling + 1) * old_font_size)

      old_font_size为该词按顺序本应被赋予的大小。

  3. 单词处理(10)

    • max_words=200】:int。

      最大单词数

    • min_word_length=0】:int。

      能包含的最短单词

    • include_numbers=False】:bool。

      是否包含数字

    • repeat=False】:bool。

      是否重复单词或短语直到达到max_words或者min_font_size

    • stopwords=None】:set of strings or None。

      淘汰单词集合。默认为None,即使用模块内置的STOPWORDS集合;如果所有单词都需要可设置为空集合。当使用generate_from_frequencies方法时,该参数被忽略。

    • normalize_plurals=True】:bool。

      是否去除尾随“s”。默认为True,即去除尾随“s”,并把其加入到其无尾随“s”的单词计数中,-ss结尾除外。当使用generate_from_frequencies方法时,该参数被忽略。

    • collocations=True】:bool。

      是否包含单词搭配。当使用generate_from_frequencies方法时,该参数被忽略。

    • collocation_threshold=30】:int。

      搭配词语必须具有比这个参数更大的搭配可能性评分才被视为搭配词。

    • prefer_horizontal=0.9】:float。

      水平垂直拟合次数比率。值 < 1时,如果单词不合适,将尝试旋转单词。= 1时,单词全部水平。

    • regexp=None】:string or None。

      process_text中将输入文本分割成tokens的正则表达式。默认为None,即使用正则表达式 r"\w[\w']+" 。当使用generate_from_frequencies方法时,该参数被忽略。

  4. 其他(2)

    • random_state=None】:random.Random([seed]) or int or None。

      指定一个随机数对象或随机数种子,用于生成随机数。默认为None,即使用random.Random()生成一个随机数对象。

    • ranks_only=None】:

      该参数将会被删除。

方法

  1. 词云生成

    • fit_words(frequencies) == generate_from_frequencies(frequencies, max_font_size=None)

      根据单词和频数创建词云。

      参数

      • frequencies:dict(str, int)。

        待生成词云的单词-词频字典。

      • max_font_size=None:int。

        该值会替换wordcloud.WordCloud(**kwargs)max_font_size值。(建议忽略)

      返回

      词云对象

    • process_text(text)

      根据词云对象提供的regexp,以及不绘入词云的词集合,将文本进行切割。

      参数

      • text:str

        待分割文本。

      返回

      dict(str, int)

    • generate_from_text(text) == generate(text)

      从文本生成词云。内部调用process_text(text)generate_from_frequencies(frequencies)

      参数

      • text: str。

        待生成词云的文本。

      返回

      词云对象

    • recolor(random_state=None, color_func=None, colormap=None)

      重新着色现有布局。必须先调用generate_from_text(text) 或者 fit_words(frequencies)生成词云。

      本质为利用color_func传入的函数对象更改生成的词云的layout_属性中每个词的color值.

      参数

      • random_state=None: random.Random([seed]), int, or None。

        指定一个随机数对象或随机数种子,用于生成随机数,传给颜色生成函数。默认为None,即使用random.Random()生成一个随机数对象。

      • color_func=None: function or None。

        传入颜色生成函数来生成颜色。默认为None,此时如果colormap=None,则使用类WordCloud传入的颜色生成函数,否则使用colormap_color_func(colormap)创建的函数。

        ---源码---
        
        self.layout_ = [(word_freq, font_size, position, orientation,
                                 color_func(word=word_freq[0], 
                                            font_size=font_size,
                                            position=position, 
                                            orientation=orientation,
                                            random_state=random_state,
                                            font_path=self.font_path))
                                for word_freq, font_size, position, orientation, _
                                in self.layout_]
        
      • colormap=None: string or matplotlib colormap or None。

        传给类colormap_color_func(colormap)来创建函数对象用来生成随机颜色,如果color_func!=None,该参数被覆盖。

      返回

      词云对象

  2. 类型转换

    • to_array()

      将词云对象图片转换为numpy数组。

      返回

      numpy数组

    • to_file(filename)

      将词云对象转换为图片并保存为指定文件。

      参数

      • filename: str。

        指定保存的文件。

      返回

      词云对象

    • to_svg(embed_font=False, optimize_embedded_font=True, embed_image=False)

      参数

      • embed_font=False: bool。

        是否在生成的SVG文件中包含字体。

      • optimize_embedded_font=True: bool。

        是否优化字体。

      • embed_image=False: bool。

        是否在生成的SVG文件中包含光栅化图像。对调试很有用。

      返回

      SVG字符串

属性

必须先调用generate_from_text(text) 或者 fit_words(frequencies)生成词云后才能访问。

  1. words_

    返回词云对象的词语-频数dict(str, float)

  2. layout_

    返回每个词的((str, float), font_size, position(x, y), orientation, rgb_color)组成的的列表

函数wordcloud.random_color_func(random_state=None)

随机色相颜色生成,值为80%,亮度为50%,是默认的着色方法。

参数

  • word, font_size, position, orientation, font_path

    全部忽略。

  • random_state=None: random.Random([seed]) or None。

    用于生成随机数。默认为None,即random.Random()

返回

hsl(random_state. randint(0, 255), 80%, 50%)

示例

---代码---

# 导入
import wordcloud
import random

# 调用函数
result = wordcloud.random_color_func(random_state=random.Random(10))

# 结果
print(result)

---结果---

hsl(16, 80%, 50%)

函数wordcloud.get_single_color_func(color)

创建一个颜色函数,该函数返回单个色调和饱和度。

参数

  • color: color value。

    待提取色调和饱和度的颜色。

返回

函数对象。该函数对象需传入参数(word, font_size, position, orientation, font_path, random_state)

​ 其中random_state=None: random.Random([seed]) or None。

​ 函数对象返回:rgb(r, g, b)

示例

---代码---

# 导入
import wordcloud
import random

# 创建函数对象
rgb_func = wordcloud.get_single_color_func("black")

# 调用函数对象
result = rgb_func(random_state=random.Random(10))

# 结果
print(result)

---结果---

rgb(168, 168, 168)

wordcloud.wordcloud.colormap_color_func(colormap)

从matplotlib colormap创建颜色函数。主要由recolor方法内部调用。

参数

  • colormap: str or matplotlib colormap。

    待从中采样的颜色图。

返回

函数对象,该函数对象需传入参数random_state=None: random.Random([seed]) or None。

​ 另外还需传入四个无义位置参数,可传入None。

​ 函数对象返回:rgb(r, g, b),为随机颜色。

示例

---代码---

# 导入
import wordcloud
import random

# 创建函数对象
rgb_func = wordcloud.wordcloud.colormap_color_func("Blues")

# 调用函数对象
result = rgb_func(None, None, None, None, random_state=random.Random(10))

# 结果
print(result)

---结果---

rgb(83, 158, 205)

示例

常用参数:

wordcloud.WordCloud(font_path=None 				# 设置字体
    				width=400, 					# 画布宽度
                    height=200, 				# 画布高度
                    background_color="black", 	# 背景颜色
                    mask=None, 					# 图像掩码
                    contour_width=0, 			# 轮廓宽度
                    contour_color="black", 		# 轮廓颜色
                    scale=1, 					# 缩放倍数
                    
                    min_font_size=4, 			# 最小字体大小
                    font_step=1, 				# 字体间步长
                    color_func=None, 			# 颜色设置函数
                    
                    max_words=200, 				# 最大单词数
                    min_word_length=0, 			# 最短单词长
                    prefer_horizontal=0.9, 		# 水平垂直拟合比例,=1时单词全部水平
                    repeat=False, 				# 是否重复,单词数较少时可设置重复填充图像
                    stopwords=None, 			# 淘汰单词集合,当需要所有词时可设置为空集合
                   )

注:mask使用的图片尽量背景为白色,待形成词云的区域较突出。

最简单无图像词云(不修改任何参数):

# 导入
import wordcloud

# 词云文本
en_text = """
There are moments in life
when you miss someone so much that you just want to pick them from your dreams
and hug them for real!
Dream what you want to dream;
go where you want to go;
be what you want to be,
because you have only one life
and one chance to do all the things you want to do.
"""

# 创建词云对象
wc = wordcloud.WordCloud()

# 向词云对象添加文本
wc = wc.generate(en_text)

# 将词云对象保存为当前路径下的result.png
wc.to_file("./result.png")
result

有图像词云(重点修改mask参数添加图像)

import wordcloud
import numpy as np
from PIL import Image

# 词云文本
en_text = """
There are moments in life
when you miss someone so much that you just want to pick them from your dreams
and hug them for real!
Dream what you want to dream;
go where you want to go;
be what you want to be,
because you have only one life
and one chance to do all the things you want to do.
"""

# 转化指定图像:图像背景尽量为白色,图像突出
mask = np.array(Image.open("./皮卡丘.jpg"))

# 创建词云对象
wc = wordcloud.WordCloud(
                    	mask=mask, 					# 图像掩码 添加了图片
                    	contour_width=1, 			# 轮廓宽度 轮廓宽为1
                    	contour_color="yellow", 	# 轮廓颜色 轮廓颜色为黄色
                    	repeat=True, 				# 是否重复 单词较少,重复单词以填满
                   		)

# 向词云对象添加文本
wc = wc.generate(en_text)

# 将词云对象保存为当前路径下的result.png
wc.to_file("./result.png")
皮卡丘 result

单个单词形成词云(重点需设置repeat=True,使得重复填充满)

import wordcloud
import numpy as np
from PIL import Image

# 词云文本
en_text = "love"

# 转化指定图像:图像背景尽量为白色,图像突出
mask = np.array(Image.open("./love.jpg"))

# 创建词云对象
wc = wordcloud.WordCloud(
                   		 mask=mask, 	# 图像掩码 添加了图片   
                         repeat=True, 	# 是否重复 单词较少,重复单词以填满
                  		)

# 向词云对象添加文本
wc = wc.generate(en_text)

# 将词云对象保存为当前路径下的result.png
wc.to_file("./result.png")
love result

给所有单词指定同一种颜色(重点修改color_func参数)

需安装第三方模块webcolors:pip install webcolors,也可通过其他方式将颜色字符串转变为rgb值。

import wordcloud
import numpy as np
from PIL import Image
import webcolors #用于颜色转换的函数

# 词云文本
en_text = """
There are moments in life
when you miss someone so much that you just want to pick them from your dreams
and hug them for real!
Dream what you want to dream;
go where you want to go;
be what you want to be,
because you have only one life
and one chance to do all the things you want to do.
"""

# 转化指定图像:图像背景尽量为白色,图像突出
mask = np.array(Image.open("./love.jpg"))

# 创建词云对象
wc = wordcloud.WordCloud(
                    	mask=mask, 					# 图像掩码 添加了图片
                    	contour_width=1, 			# 轮廓宽度 轮廓宽为1
                    	contour_color="red", 	    # 轮廓颜色 轮廓颜色为红色
                    	color_func=lambda *word, **kwargs: webcolors.name_to_rgb("red"), 			# 颜色设置函数 使用匿名函数设置所有单词为红色   
                    	repeat=True, 				# 是否重复 单词较少,重复单词以填满
                    	prefer_horizontal=1,  		# 水平垂直拟合比例,=1时单词全部水平     
                   		)

# 向词云对象添加文本
wc = wc.generate(en_text)

# 将词云对象保存为当前路径下的result.png
wc.to_file("./result.png")
result

给指定单词指定颜色(重点修改color_func参数)

import wordcloud
import numpy as np
from PIL import Image
import webcolors

# 词云文本
en_text = """
There are moments in life
when you miss someone so much that you just want to pick them from your dreams
and hug them for real!
Dream what you want to dream;
go where you want to go;
be what you want to be,
because you have only one life
and one chance to do all the things you want to do.
"""

# 建立颜色-词语字典
color_words = {
    "red":['moments', 'life'],                                                     # 红色
    "green":['miss','someone', 'much'],                                            # 绿色 
    "blue":['want', 'pick'],                                                       # 蓝色
    "yellow":['hug', 'real', 'dream', 'go', 'one', 'chance', 'things'],            # 其他黄色
    }

# 转化为词语-颜色字典
word_color = {}
for color, words in color_words.items():
    for word in words:
        word_color[word] = color
"""
{
    'moments': 'red',
    'life': 'red',
    'miss': 'green',
    'someone': 'green',
    'much': 'green',
    'want': 'blue',
    'pick': 'blue',
    'hug': 'yellow',
    'real': 'yellow',
    'dream': 'yellow',
    'go': 'yellow',
    'one': 'yellow',
    'chance': 'yellow',
    'things': 'yellow'
}
"""

    
# 转化指定图像:图像背景尽量为白色,图像突出
mask = np.array(Image.open("./皮卡丘.jpg"))

# 创建词云对象
wc = wordcloud.WordCloud(
                    	mask=mask, 					# 图像掩码 添加了图片
                    	contour_width=1, 			# 轮廓宽度 轮廓宽为1
                    	contour_color="yellow", 	# 轮廓颜色 轮廓颜色为黄色
                    	repeat=True, 				# 是否重复 单词较少,重复单词以填满
                        color_func=lambda *word, **kwargs: webcolors.name_to_rgb(word_color[word[0]]), 			# 颜色设置函数 使用匿名函数设置
                   	    )

# 向词云对象添加文本
wc = wc.generate(en_text)

# 将词云对象保存为当前路径下的result.png
wc.to_file("./result.png")
result

中文词云(重点更改font_path参数,同时注意处理中文文本)

import wordcloud
import numpy as np
from PIL import Image
import jieba

# 词云文本
zh_text = """
不要在本该奋斗的年纪选择了安逸,
只有度过了一段连自己都被感动的日子,
才会遇见那个最好的自己,未来的你,
一定会感谢现在拼命努力的自己。永远相信,越努力,越幸运,
所有失去的,都会以另一种方式归来,
踏实一些,
你想要的,岁月统统都会给你。
"""

# 处理文本,去除中文标点,词语间以空格分开(必需)
zh_words = jieba.lcut(zh_text)
for i in zh_words:
    if i in "\n。,":
        for n in range(zh_words.count(i)):
            zh_words.remove(i)
zh_words = " ".join(zh_words) # 必需处理为空格分隔的词语字符串,类似英文
"""
不要 在 本该 奋斗 的 年纪 选择 了 安逸 只有 度过 了 一段 连 自己 都 被 感动 的 日子 才 会 遇见 那个 最好 的 自己 未来 的 你 一定 会 感谢 现在 拼命 努力 的 自己 永远 相信 越 努力 越 幸运 所有 失去 的 都 会 以 另 一种 方式 归来 踏实 一些 你 想要 的 岁月 统统 都 会 给 你
"""
    
# 转化指定图像:图像背景尽量为白色,图像突出
mask = np.array(Image.open("./皮卡丘.jpg"))

# 创建词云对象
wc = wordcloud.WordCloud(
                         repeat=True, 				# 是否重复 单词较少,重复单词以填满
                         font_path="msyh.ttc",      # 设置为中文支持的字体(必需)
                   		)

# 向词云对象添加文本
wc = wc.generate(zh_words)

# 将词云对象保存为当前路径下的result.png
wc.to_file("./result.png")

result

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

此间风月不及君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值