已知詞頻生成詞雲圖(數據庫到生成詞雲)--generate_from_frequencies(WordCloud)

詞雲圖是根據詞出現的頻率生成詞雲,詞的字體大小表現了其頻率大小。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給出,以下圖:字體

 

1、數據文件準備

support_institution.csv

數據庫字段分組查詢數量

select support_institution name,count(support_institution) value from nsfc GROUP BY name ORDER BY value DESC; 

查詢結果部分截圖:  

 

導出爲csv文件:support_institution.csv

 

2、導入模塊包

可參考Windows下安裝Python、matplotlib包 及相關
https://blog.csdn.net/mikasa3/article/details/78942650 

一、numpy

二、pandas

三、wordcloud

四、matplotlib

 

3、完整代碼

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")

 

4、運行結果

 詞雲圖:

 

5、補充:WordCloud的參數詳解

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 )
wordcloud參數

 

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,則忽略該方法。
wordcloud參數詳解

 

 

PS:如下內容能夠不看,固然,看我也攔不住 ○( ^皿^)っHiahiahia…

 

上面的中國地圖顯示的詞雲並很差看(可能由於詞語過長),因此補充一個好看的做品(*^▽^*)

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

相關文章
相關標籤/搜索