wordcloud作者github应用实例:
https://github.com/amueller/word_cloud/blob/master/examples/masked.py
官网:https://amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html
内容包括:生成中文词云、英文词云、根据单词出现频率生成词云
参数设定
WordCloud可以直接pip安装,在Anaconda里python -m pip install SomePackage(包名)就可以安装。
WordCloud()部分常用参数
font_path:string字体,中文需要设定中文字体
width:int (default=400)宽
height:int (default=200)高
prefer_horizontal:float (default=0.90)水平与竖直排版比,小于1则将不合适水平词语竖直显示,大于1则只水平
mask:nd-array or None (default=None) 背景图,white (#FF or #FFFFFF)区域不能放词。
scale:float (default=1) 对大型词云用scale缩放比放大尺寸生成速度更快,但可能模糊
max_words:number (default=200)最大词量
stopwords:set of strings or None如果不设定停止词则使用默认STOPWORDS
background_color:color value (default=”black”)设置背景色
mode:string (default=”RGB”)设定RGBA则背景变为透明
wordcloud.WordCloud方法
我使用过的:
generate(text)Generate wordcloud from text.生成词云
to_file(filename)Export to image file. 保存图片
recolor([random_state, color_func, colormap])Recolor existing layout.对已有的词云重新配色(比重新生成某种颜色的词云快)
process_text(text)Splits a long text into words, eliminates the stopwords.返回统计文本中单词频率的dict
generate_from_frequencies(frequencies[, …])Create a word_cloud from words and frequencies.根据频率生成词云
没用过的:
fit_words(frequencies) Create a word_cloud from words and requencies.
generate_from_text(text)Generate wordcloud from text.
to_array()Convert to numpy array.
应用
注意:
1、词云每次随机生成,再次运行则生成新词云。
2、wordcloud.to_file(‘myfig.png’)的方法生成词云比plt.savefig更清楚,后者不能反映词云设置的大小等参数。
以下代码中text文件选择了分别包含林俊杰对的时间点的中英文歌词的两个txt,掩码图片选了一张白底png图片。
无背景词云
from wordcloud import WordCloud
import matplotlib.pyplot as plt
text = open('C:/Users/Violette/Desktop/data/As I believe.txt').read()#读入文本
wordcloud=WordCloud()
wordcloud.generate(text)
image=wordcloud.to_image()
plt.imshow(image) # 显示图片
plt.axis('off') # 不显示坐标轴
plt.savefig('C:/Users/Violette/Desktop/data/myfig.png')
plt.show()1
2
3
4
5
6
7
8
9
10
11
无背景频率词云
统计文本中单词出现的频率,频率越大的单词词云中字体越大。
用process_word()方法统计单词频率,返回dict
generate_from_frequencies(dict)方法生成频率词云
from wordcloud import WordCloud
import matplotlib.pyplot as plt
text = open('C:/Users/Violette/Desktop/data/As I believe.txt').read()#读入文本
wordcloud=WordCloud()
process_word=WordCloud.process_text(wordcloud,text)
print(process_word)
wordcloud.generate_from_frequencies(process_word)
image=wordcloud.to_image()
plt.imshow(image) # 显示图片
plt.axis('off') # 不显示坐标轴
plt.savefig('C:/Users/Violette/Desktop/data/myfig.png')
plt.show()1
2
3
4
5
6
7
8
9
10
11
12
13
在歌词中出现频率最高的词是’believe’: 8,‘know’: 8所以这两个词在图像中最大:
背景词云
在图片mask上生成词云,多增加一步读入背景图并将图片转换为数组:
需要import的文件:
import numpy as np
from PIL import Image
需要将读取图像转为数组格式来进行后续操作:
mask_image=np.array(Image.opern(‘mask.png’))
wordcloud=WordCloud(background_color=“white”,width=600, max_words=100, mask=mask_image).generate(text)
如果需要转换颜色为mask颜色则:
from wordcloud import ImageColorGenerator
image_colors = ImageColorGenerator(mask_image)#提取颜色
wordcloud.recolor(color_func=image_colors)#重置颜色函数
使用recolor重置颜色,可以将词云在mask对应位置的字体颜色变为mask图片上的颜色。
完整代码:
from wordcloud import WordCloud, ImageColorGenerator#用于提取图片颜色
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
text = open('C:/Users/Violette/Desktop/data/As I believe.txt').read()#读入文本
images=Image.open('C:/Users/Violette/Desktop/data/heart.png')#读入背景图
mask_image=np.array(images)#图片转化为数组
#等价于mask_image = np.array(Image.open('C:/Users/Violette/Desktop/data/heart.png'))
wordcloud=WordCloud(background_color="white",width=600, max_words=100,
mask=mask_image).generate(text)#生成词云图
#提取mask颜色
image_colors = ImageColorGenerator(mask_image)
#wordcloud.recolor(color_func=image_colors)#重置颜色函数
image=wordcloud.to_image()
# 显示图像
fig,axes = plt.subplots(1,2)
axes[0].imshow(wordcloud)#不设置颜色
axes[1].imshow(wordcloud.recolor(color_func=image_colors))#将词云颜色设置为mask的颜色
for ax in axes:
ax.set_axis_off()#给每幅图都去坐标轴
plt.savefig('C:/Users/Violette/Desktop/data/myfig.png')
plt.show()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
中文词云
关于读中文txt参考原文链接:https://blog.csdn.net/jingyi130705008/article/details/71513984
文中提到txt使用utf8编码的时候会默认在文件开头插入三个不可见字符,python定义为codecs.BOM_UTF8。
对python2.7:
读中文txt时必须先比较前三个字符与codecs.BOM_UTF8,如果一样就删除前三个字符然后再decode。
import codecs
data = open("Test.txt").read()
if data[:3] == codecs.BOM_UTF8:
data = data[3:]
print data.decode("utf-8")1
2
3
4
5
对python3:
读取文件时解码可以直接encoding=‘gbk’
调用WordCloud时,设定字体参数font_path
text = open('C:/Users/Violette/Desktop/data/chinese.txt',encoding='gbk').read()#读入txt格式中文文本
text = open('C:/Users/Violette/Desktop/liao_excel/classify_model1.csv',encoding='utf-8').read()#csv格式中文文本
wordcloud=WordCloud(font_path='C:/Windows/Fonts/simfang.ttf',background_color="white",width=600, max_words=100, mask=mask_image).generate(text)#生成词云图时需要设定字体参数font_path1
2
3