python制作词云图

开局10分钟

关于wordcloud库的安装问题在上一篇的博客中已经介绍了,这篇主要和大家分享我学习使用wordcloud库的一些经历。

tips:需要注意的是使用wordcloud库是依赖numpy库和PIL库的,因此需要提前安装好这两个库

证据如下:打开wordcloud.py

1、wordcloud库

参考资料如下:https://amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html

wordcloud模块中有三个函数分别是:

wordcloud.WordCloud()    

wordcloud.ImageColorGenerator( )  

wordcloud.random_color_func( )

1.1 wordcloud.WordCloud()

wordcloud.WordCloud()  #用于生成或者绘制词云的对象

class wordcloud.WordCloud(font_path=Nonewidth=400height=200margin=2ranks_only=Noneprefer_horizontal=0.9mask=Nonescale=1color_func=Nonemax_words=200min_font_size=4stopwords=Nonerandom_state=Nonebackground_color='black'max_font_size=Nonefont_step=1mode='RGB'relative_scaling='auto'regexp=Nonecollocations=Truecolormap=Nonenormalize_plurals=Truecontour_width=0contour_color='black'repeat=False)

参数介绍:

font_path : 字体路径(需要设置什么样的字体,就将字体路径以字符串的形式传入。默认为wordcloud库下的DroidSansMono.ttf                    字体)tips:如果选用默认字体的话,是不能够显示中文字的。为使得能够显示中文,可以自己设置字体。系统字体一般都在C:\Windows\Fonts 目录下。之前别人博客中提到的设置为STFANGSO.TTF就是华文仿宋。选择自己想要设置的字体,然后右击属性,复制路径然后赋值给font_path即可。

width:画布宽度。(学过matplotlib的同学肯定就知道了,默认为400像素)

height:画布高度(默认为200)

margin:每个单词间的间隔 (默认为2)

prefer_horizontal :词语水平方向排版出现的频率(默认为0.9,注意水平排版和垂直排版概率之和为1,因此默认垂直方向排版为0.1)

mask:nd-array or None (default=None), 简单理解为绘制模板。当mask不为0时,那么之前依据heightwidth设置的画布则作废,此时“画布”形状大小由mask决定。

scale:float (default=1). 计算和绘图之间的比例(就是放大画布的尺寸,也可以叫比例尺)。对于大型词云图,使用比例尺比设置画布尺寸            来得更加快速,但是单词匹配不是很好。

max_words:number (default=200) 最大显示单词字数。

max_font_size:int or None (default=None) 最大单词的字体大小,如果没有设置的话,直接使用画布的大小。

stopwords:set of strings or None 被淘汰不用于显示的词语,默认使用内置的stopwords。

background_color:color value (default=”black”) 词云图像的背景色,默认为黑色。

mode:string (default=”RGB”) 当mode=“RGBA”且background_color=“None”时,将生成透明的背景。

relative_scaling:float (default=’auto’) 词频大小对字体大小的影响度。如果设置为1的话,如果一个单词出现两次那么其字体大小为原来 的两倍。

color_func:callable, default=None  生成新颜色的函数,如果为空,则使用self.color_func。注意的是如果你想要使得字体颜色为统一的颜色,使用如下

color_func=lambda *args, **kwargs: "white"  #所有字体为白色
# 或者通过设置RGB来解决.
color_func=lambda *args, **kwargs: (255,0,0) #所有字体颜色为红色

regexp:string or None (optional) 使用正则表达式分割输入的字符。没有指定的话就使用r"\w[\w']+"。

collocations:bool, default=True 是否包括两个词的搭配(双宾语)

colormap:string or matplotlib colormap, default=”viridis”。颜色映射方法,每个单词对应什么颜色,就是根据这个colormap的。如果设置 color_func ,则设置的这个作废。

repeat: bool, default=False  是否需要重复单词以使得总单词数量达到max_words。

1.2 wordcloud.ImageColorGenerator( )

class wordcloud.ImageColorGenerator(image, default_color=None)

依据彩色颜色生成颜色。单词将使用彩色图像中包围矩形的平均颜色进行着色。

生成的对象用法:1、可以传入给wordcloud.WordCloud()构造函数中的color_func参数。

                             2、可以传入给recolor函数中的color_func参数。

参数介绍:

image :用于生成单词颜色的图像。

1.3 wordcloud.random_color_func( )

wordcloud.random_color_func(word=None, font_size=None, position=None, orientation=None, font_path=None, random_state=None)

默认着色方法。选取一个随机色调,值80%和亮度50%。

具体功能效果,还请大家自己去尝试,静待反馈。

2、词云图生成方法

1、fit_words(frequencies)   # 根据词频生成词云图

2、generate(text)   # 根据文本生成词云图

3、generate_from_frequencies(frequencies[, …])  # 根据词频生成词云图

4、generate_from_text(text)    # 根据文本生成词云图

5、process_text(text)      # 将长文本拆分成单词,消除词尾。

6、recolor([random_state, color_func, colormap])   # 对现有的字体颜色进行重新染色。重新染色会比重新生成整个词云快很多

3、生成的词云图存储展示方法

3.1 存储

1、to_file(filename)   导出到图像文件,filename为输出路径  如r ' E:\master\picture.png '

2、通过matplotlib库。(利用plt.imshow(con) 读取生成的词云图,然后 plt.savefig(filename)。 tips:当你使用ipython 或者 python等一步一输出的交互式IDLE时,你会发现保存的图片是空白,不要困扰,这是正常的。解决办法之一就是,你使用文件式IDLE,比如:Spyder,或者jupyter notebook,编写程序后执行。

3.2 词云图展示

1、可以在导出文件后,根据路径找到后直接打开(蠢方法)。

(不嫌麻烦的话,导入PIL库,使用PIL.Image.open(图片路径)即可)

2、使用plt.show(con) 即可。  ##con为使用词云图生成方法后,生成的词云图。

4、简单实例

import wordcloud #导入词云库
import numpy as np
import matplotlib.pyplot as plt
import PIL
import jieba
import re
with open(r'E:\master\txt1.txt',encoding='utf8') as f:
    text1 = f.readlines()
#导入图片
image1 = PIL.Image.open(r'E:\master\picture.jpg')
MASK = np.array(image1)
WC = wordcloud.WordCloud(font_path = 'C:\\Windows\\Fonts\\STFANGSO.TTF',max_words=2000,mask = MASK,height= 400,width=400,background_color='white',repeat=False,mode='RGBA') #设置词云图对象属性
st1 = re.sub('[,。、“”‘ ’]','',str(text1)) #使用正则表达式将符号替换掉。
conten = ' '.join(jieba.lcut(st1)) #此处分词之间要有空格隔开,联想到英文书写方式,每个单词之间都有一个空格。
con = WC.generate(conten)
plt.imshow(con)
plt.axis("off")

原来图片:

输出图片:

猜你喜欢

转载自blog.csdn.net/moshanghuali/article/details/84667136