词云图是根据词出现的频率生成词云,词的字体大小表现了其频率大小。html
写在前面:python
用wc.generate(text)直接生成词频的方法使用不少,因此再也不赘述。正则表达式
可是对于根据generate_from_frequencies()给定词频如何画词云图的资料找了好久,下面只讲这种方法。sql
generate_from_frequencies适用于我已知词及其对应的词频是多少(已有数据库),不须要分词的状况下。数据库
官方文档说generate_from_frequencies函数的参数是array of tuple,可是我试了好久都不行,最后发现竟然应该是dict 字典形式!dom
即形如:{ word1: fre1, word2: fre2, word3: fre3,......, wordn: fren }ide
注意:函数
词云wordcloud的中文显示,须要特殊处理,在网上看了很多是说加字体路径之类的方法我试了都不行,最后只好采用改变编码的形式才解决好。工具
fp = pd.read_csv(read_name, encoding='gbk') # 读取词频csv文件, 编码为gbk
还有,示例词云的轮廓背景图由china_map.jpg给出,以下图:字体
support_institution.csv
数据库字段分组查询数量
select support_institution name,count(support_institution) value from nsfc GROUP BY name ORDER BY value DESC;
查询结果部分截图:
导出为csv文件:support_institution.csv
可参考Windows下安装Python、matplotlib包 及相关
https://blog.csdn.net/mikasa3/article/details/78942650
一、numpy
二、pandas
三、wordcloud
四、matplotlib
import numpy as np import pandas as pd from wordcloud import WordCloud, ImageColorGenerator import matplotlib.pyplot as plt from PIL import Image def draw_cloud(read_name): image = Image.open('china_map.jpg') # 做为背景轮廓图 graph = np.array(image) # 参数分别是指定字体、背景颜色、最大的词的大小、使用给定图做为背景形状 wc = WordCloud(font_path='simkai.ttf', background_color='black', max_words=100, mask=graph) fp = pd.read_csv(read_name, encoding='gbk') # 读取词频文件, 由于要显示中文,故编码为gbk name = list(fp.name) # 词 value = fp.val # 词的频率 for i in range(len(name)): name[i] = str(name[i]) dic = dict(zip(name, value)) # 词频以字典形式存储 wc.generate_from_frequencies(dic) # 根据给定词频生成词云 image_color = ImageColorGenerator(graph) plt.imshow(wc) plt.axis("off") # 不显示坐标轴 plt.show() wc.to_file('nsfc依托单位词云.png') # 图片命名 if __name__ == '__main__': draw_cloud("support_institution.csv")
词云图:
WordCloud(font_path='', width=400, height=200, margin=2, ranks_only=None, prefer_horizontal=0.9, mask=None, scale=1, color_func=None, max_words=200, min_font_size=4, stopwords=None, random_state=None, background_color='black', max_font_size=None, font_step=1, mode='RGB', relative_scaling=0.5, regexp=None, collocations=True, colormap=None, normalize_plurals=True )
font_path : string # 字体路径,须要展示什么字体就把该字体路径+后缀名写上,如:font_path = '黑体.ttf' width : int (default=400) # 输出的画布宽度,默认为400像素 height : int (default=200) # 输出的画布高度,默认为200像素 prefer_horizontal : float (default=0.90) # 词语水平方向排版出现的频率,默认 0.9 (因此词语垂直方向排版出现频率为 0.1 ) mask : nd-array or None (default=None) # 若是参数为空,则使用二维遮罩绘制词云。若是 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。除全白(#FFFFFF)的部分将不会绘制,其他部分会用于绘制词云。 # 如:bg_pic = imread('读取一张图片.png'),背景图片的画布必定要设置为白色(#FFFFFF),而后显示的形状为不是白色的其余颜色。能够用ps工具将本身要显示的形状复制到一个纯白色的画布上再保存,就ok了。 scale : float (default=1) # 按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍。 min_font_size : int (default=4) # 显示的最小的字体大小 font_step : int (default=1) # 字体步长,若是步长大于1,会加快运算可是可能致使结果出现较大的偏差。 max_words : number (default=200) # 要显示的词的最大个数 stopwords : set of strings or None # 设置须要屏蔽的词,若是为空,则使用内置的STOPWORDS background_color : color value (default=”black”) # 背景颜色,如background_color='white',背景颜色为白色。 max_font_size : int or None (default=None) # 显示的最大的字体大小 mode : string (default=”RGB”) # 当参数为“RGBA”而且background_color不为空时,背景为透明。 relative_scaling : float (default=.5) # 词频和字体大小的关联性 color_func : callable, default=None # 生成新颜色的函数,若是为空,则使用 self.color_func regexp : string or None (optional) # 使用正则表达式分隔输入的文本 collocations : bool, default=True # 是否包括两个词的搭配 colormap : string or matplotlib colormap, default=”viridis” # 给每一个单词随机分配颜色,若指定color_func,则忽略该方法。
上面的中国地图显示的词云并很差看(可能由于词语过长),因此补充一个好看的做品(*^▽^*)
2019国务院政府工做报告词云。
文本地址:
http://www.gov.cn/guowuyuan/baogao.htm
全文代码:
# coding:utf-8 import jieba # 分词 import matplotlib.pyplot as plt # 数据可视化 from wordcloud import WordCloud, ImageColorGenerator, STOPWORDS # 词云 import numpy as np # 科学计算 from PIL import Image # 处理图片 def draw_cloud(text, graph, save_name): textfile = open(text).read() # 读取文本内容 wordlist = jieba.cut(textfile, cut_all=False) # 中文分词 space_list = " ".join(wordlist) # 链接词语 backgroud = np.array(Image.open(graph)) # 背景轮廓图 mywordcloud = WordCloud(background_color="white", # 背景颜色 mask=backgroud, # 写字用的背景图,从背景图取颜色 max_words=100, # 最大词语数量 stopwords=STOPWORDS, # 停用词 font_path="simkai.ttf", # 字体 max_font_size=200, # 最大字体尺寸 random_state=50, # 随机角度 scale=2, collocations=False, # 避免重复单词 ) mywordcloud = mywordcloud.generate(space_list) # 生成词云 ImageColorGenerator(backgroud) # 生成词云的颜色 plt.imsave(save_name, mywordcloud) # 保存图片 plt.imshow(mywordcloud) # 显示词云 plt.axis("off") # 关闭保存 plt.show() if __name__ == '__main__': draw_cloud(text="government.txt", graph="china_map.jpg", save_name='2019政府工做报告词云.png')
词云图:
原文出处:https://www.cnblogs.com/liangmingshen/p/11312257.html