詞雲圖是根據詞出現的頻率生成詞雲,詞的字型大小表現了其頻率大小。
寫在前面:
用wc.generate(text)直接生成詞頻的方法使用很多,所以不再贅述。
但是對於根據generate_from_frequencies()給定詞頻如何畫詞雲圖的資料找了很久,下面只講這種方法。
generate_from_frequencies適用於我已知詞及其對應的詞頻是多少(已有資料庫),不需要分詞的情況下。
官方文件說generate_from_frequencies函式的引數是array of tuple,但是我試了很久都不行,最後發現居然應該是dict 字典形式!
即形如:{ word1: fre1, word2: fre2, word3: fre3,......, wordn: fren }
注意:
詞雲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
二、匯入模組包
可參考Windows下安裝Python、matplotlib包 及相關
https://blog.csdn.net/mikasa3/article/details/78942650
1、numpy
2、pandas
3、wordcloud
4、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的引數詳解
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,則忽略該方法。
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')
詞雲圖: