詞雲圖作爲一種分析熱度的可視化圖,在數據分析佔據重要地位,只一眼就可以看出某個事物的重要性。pyecharts和WordCloud都是比較方便的可視化庫,當遇上詞雲圖,會有怎樣的火花呢?我們來期待一下。
1.pyecharts
1.導入包
首先保證自己電腦安裝上了pyecharts包,關於包的安裝就不多說,來來去去就那幾種方法,網上已經說的太多了。
from pyecharts.charts import WordCloud
2.數據準備
用pyecharts畫詞雲時,待分析數據中的每一個詞爲應該爲(word,value)的元組形式,所有詞組成一個列表。其中,word爲我們需要在詞雲圖中顯示的詞彙,value是對應的頻率。在實現操作中,我將word和value分別形成列表進行輸入,結果發現參數個數錯誤,而使用(word,value)的形式就正確。
word=[("數學分析",0.9),("高等代數",0.9),("近世代數",0.6),("計算機網絡",0.8),("現代密碼學",0.5),
("c程序設計",0.8),("數據結構與算法",0.9),("泛函分析",0.8),("機器學習實戰",1.0),("數據挖掘導論",0.9)]
3.詞雲圖生成
pyecharts中,主要使用add()函數來生成並設置詞雲圖:
mywordcloud=WordCloud()
#shape詞雲圖輪廓,有’circle’, ‘cardioid’, ‘diamond’, ‘triangleforward’, ‘triangle’, ‘pentagon’, ‘star’可選
mywordcloud.add("",word,shape='star')
#生成html文件
mywordcloud.render("1.html")
運行程序,得到
是不是很簡單,總結一下,用pyecharts生成詞雲圖:
-
優點:
當鼠標在html文件裏面拖動到某個詞,會出現對應的頻率,方便查看;
使用簡單,用戶只需要構建好自己的(word,values);
提供7種不同的詞輪廓,只需要簡單設置. -
缺點:
沒有詞雲填充圖片功能,也就是整個詞雲的輪廓爲所給圖片的形狀;
當所給的是一段文字,需要整理成需要的(word,values),比較複雜.
2.WordCloud
WordCloud雖然沒有pyecharts那麼簡單,但是其製作詞雲圖的功能更強大,可以製作任意形狀的詞雲圖,在舉例子之前,我們先來看看主要的配置參數:(部分引用於wordcloud參數)
> 這裏是引用
font_path : string #字體路徑,默認狀態是隻支持英文,如果是中文需要展現什麼字體就把該字體路徑+後綴名寫上,如:font_path = '黑體.ttf'
width :int #畫布寬度,默認爲400像素
height :int #畫布高度,默認爲200像素
scale: float#水平排版出現的概率,默認0.9,垂直排版概率0.1
mask:nd-array or None (default=None) #當讀取圖片爲背景時,背景色一定要設置成白色
min_font_size : int (default=4) #最小字體
max_font_size : int or None #一般不設置最好,不然會很小
font_step : int (default=1) #字體步長,如果步長大於1,會加快運算但是可能導致結果出現較大的誤差
max_words : number (default=200) #要顯示的詞的最大個數
stopwords : set of strings or None #使用時需要從wordcloud中導入STOPWORDS,設置需要屏蔽的詞
background_color : color value (default=”black”) #背景顏色
random_state : int or None #爲每個單詞返回一個PIL顏色
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,則忽略該方法
#重要函數
fit_words(frequencies) #根據詞頻生成詞雲
generate(text) #根據文本生成詞雲
generate_from_frequencies(frequencies[, ...]) #根據詞頻生成詞雲
generate_from_text(text) #根據文本生成詞雲
process_text(text) #將長文本分詞並去除屏蔽詞(此處指英語,中文分詞還是需要自己用別的庫先行實現,使用上面的 fit_words(frequencies) )
recolor([random_state, color_func, colormap]) #對現有輸出重新着色。重新上色會比重新生成整個詞雲快很多
to_array() #轉化爲 numpy array
to_file(filename) #輸出到文件
下面我以從微博上"Alex是大叔"關於12星座運勢的語句,部分如下圖
太陽或上升雙子座:任何人都怕斤斤計較的人,你在本週很可能就會遇到這種人,或者自己變成這種人,如果你遇到了斤斤計較的人,拿出你打太極的本領,迂迴過去,自己就會安全過關。但如果你變成了一個斤斤計較的人,你很可能會把一件原本很不錯的事情給搞砸,甚至可能會改變別人本來對你的美好印象。這周隨着滿月發生在你的人際關係宮位,可能會有某個合作敲定下來或者是被人搶走(也可能是取消了、打水漂了),在本週一到週四中午之前你就會知道這個消息,也許可能是你追問獲得的。
我們運用wordcloud來製作詞雲圖。背景圖片爲
from wordcloud import WordCloud,STOPWORDS
from PIL import Image
import matplotlib.pyplot as plt
import jieba
import numpy as np
content=open("1.txt","r",encoding="utf-8").read()
tag=jieba.cut(content)
#一定要用空格將關鍵字串起來
text=" ".join(tag)
#讀入背景圖片
image=np.array(Image.open("pikaqiu.jpg"))
#設置不顯示的詞,停頓詞
sw=set(STOPWORDS)
sw.add("不好")
sw.add("失落")
#生成詞雲對象
wc=WordCloud(font_path=r'C:\Users\lixue\Desktop\simhei.ttf',
#指定詞雲的形狀
mask=image,
#背景顏色
background_color="white",
scale=0.9,
random_state=20
)
#生成詞雲圖片
wc=wc.generate(text)
#顯示詞雲圖片
plt.imshow(wc)
plt.axis("off")
plt.show()
#保存圖片
wc.to_file("new_love.png")
值得注意的是,在上述代碼中,因爲我使用的是PIL包,所以讀取圖片之後要進行轉換,如果不用numpy,直接用下面的語句
image=Image.open("pikaqiu.jpg")
程序會報錯:
觀察最前面的參數mask,屬於nd-array or None 類型,所以我們必須將Image.open(“pikaqiu.jpg”)之後的結果轉爲array類型,才能保證程序的正常運行。下圖爲生成的詞雲圖
不過如果採用另外一個包scipy,就不用進行數據轉換了。將
image=np.array(Image.open("pikaqiu.jpg"))
換成
image=imread("pikaqiu.jpg"))
同時導入包
from scipy.misc import imread
兩種方法各取所需,關於參數配置,有時間的各位可以好好研究一樣,如何取到合適的值,讓生成的詞雲圖更加美觀。喜歡的點個贊吧。