各位讀者朋友們大家好啊键思,前兩天我在用Python進(jìn)行數(shù)據(jù)可視化工作的時(shí)候窜管,無意中發(fā)現(xiàn)了下面這種帶特定形狀的詞云圖(如圖1所示),我相信很多讀者和我的感受應(yīng)該是一樣的稚机,當(dāng)看到第一眼時(shí),一定會被這種圖的視覺效果所吸引获搏±堤酰看過我之前“用Python制作動態(tài)排序圖”的朋友應(yīng)該知道,Python的可視化功能相當(dāng)強(qiáng)大常熙,因此纬乍,今天便為大家出一期《如何用Python作出特定形狀詞云圖》的教程,我將以圖2所示的最終效果為例裸卫,向大家展示其完整的實(shí)現(xiàn)過程仿贬。(需要完整代碼文件的讀者可以在公眾號:全哥的學(xué)習(xí)生涯,內(nèi)回復(fù)“詞云圖代碼”獲饶够摺茧泪;需要最新停詞表的讀者可以回復(fù)“停詞表”獲取)
1. 基本思路
詞云圖聋袋,也叫文字云队伟,是對文本中出現(xiàn)頻率較高的“關(guān)鍵詞”予以視覺化的展現(xiàn),詞云圖過濾掉大量的低頻低質(zhì)的文本信息幽勒,使得瀏覽者只要一眼掃過文本就可領(lǐng)略文本的主旨嗜侮。在這種圖中,詞的形狀代表了詞頻啥容,其尺寸越大锈颗,代表出現(xiàn)頻率越高。其主要步驟如下:
1.1 首先我們需要準(zhǔn)備一份文本文件咪惠,也就是你想進(jìn)行提取分析并展示的內(nèi)容击吱,因此第一步要對這些文本內(nèi)容劃分成詞,也就是“分詞”遥昧,這一步驟主要用到的第三方庫是jieba庫姨拥,其中最主要的函數(shù)是具有中文分詞功能的函數(shù)lcut( )绅喉,正確的分詞是基礎(chǔ)。
1.2 分詞后叫乌,若想想生成特定形狀的詞云柴罐,需要先將背景圖片導(dǎo)入進(jìn)行圖片展示,這個(gè)過程需要利用PIL庫(注意PIL僅支持python2.7,若想支持Python 3.x 需要將名字變?yōu)镻illow庫)中的Image.open( )函數(shù)將圖片加載進(jìn)來憨奸。隨后需要導(dǎo)入numpy庫革屠,利用其中np.array函數(shù)將圖片轉(zhuǎn)換為ndarray類型的數(shù)據(jù)。更多Python教程請關(guān)注公眾號:全哥的學(xué)習(xí)生涯
1.3 此時(shí)排宰,就可以利用wordcloud中的Wordcloud( )函數(shù)根據(jù)分詞結(jié)果生成詞云了似芝,并通過matplotlib庫中的一系列函數(shù)進(jìn)行展示。
2. 代碼展示
在這里板甘,我以圖3中的txt格式的新年歌為例党瓮,向大家展示:
('''
#-*- coding:utf-8 -*-
# Author:全哥的學(xué)習(xí)生涯 Time:2021/1/20
#導(dǎo)入需要的模塊
import jieba
import matplotlib.pyplot as plt
from matplotlib import colors
from wordcloud import WordCloud
import numpy as np
import os
from PIL import Image
#設(shè)置適合你的工作路徑
os.chdir(r"這里填寫你的工作路徑")
print(os.getcwd())
''')
原始文件導(dǎo)入pycharm,去掉換行符和空格盐类,并進(jìn)行分詞后的效果如圖4所示寞奸。
'''
#加載需要分析的文章
text=open('1.txt',encoding="utf-8").read()
print(text)
#導(dǎo)入文本數(shù)據(jù)進(jìn)行簡單的文本處理,去掉換行符在跳,半角和全角空格
text=text.replace("\n","").replace("\u3000","").replace("\u0020","")
print(text)
#分詞
text_cut=jieba.lcut(text)
#將分好的詞用空格分隔開并連接成字符串
text_cut="? ".join(text_cut)
print(text_cut)
#加載需要分析的文章
text=open('1.txt',encoding="utf-8").read()
print(text)
#導(dǎo)入文本數(shù)據(jù)進(jìn)行簡單的文本處理枪萄,去掉換行符,半角和全角空格
text=text.replace("\n","").replace("\u3000","").replace("\u0020","")
print(text)
#分詞
text_cut=jieba.lcut(text)
#將分好的詞用空格分隔開并連接成字符串
text_cut="? ".join(text_cut)
print(text_cut)
'''
此時(shí)可以利用wordcloud庫及matplotlib庫進(jìn)行圖片展示猫妙,每一行代碼的解釋見以下代碼中的注釋部分瓷翻。
'''
#導(dǎo)入停詞
stop_words=open("停詞表.txt",encoding="utf-8").read().split("\n")
#導(dǎo)入背景圖(心形圖片),注意背景圖除了目標(biāo)形狀外割坠,其余地方都應(yīng)是空白的
background=Image.open("1.png")
#將背景圖轉(zhuǎn)換為ndarray類型的數(shù)據(jù)
graph=np.array(background)
#設(shè)置詞云中字體顏色可選擇的范圍
color_list=["#FF0000","#FF0000","#DC143C"]
colormap=colors.ListedColormap(color_list)
#生成詞云,font_path為詞云中的字體,background_color為詞云圖中背景顏色
#stopwords為去掉的停詞齐帚,mask為背景圖,colormap為詞云圖顏色
word_cloud=WordCloud(font_path="C:/Windows/Fonts/simsun.ttc",
? ? ? ? ? ? ? ? ? ? background_color="white",stopwords=stop_words,mask=graph,colormap=colormap)
#生成詞云
word_cloud.generate(text_cut)
'''
'''
#運(yùn)用matplotlib中的相關(guān)函數(shù)生成詞云
plt.figure(figsize=(12,8),dpi=100)
#顯示詞云
plt.imshow(word_cloud)
#去掉其顯示的坐標(biāo)軸
plt.axis("off")
#保存詞云圖
plt.savefig("詞云圖.png")
plt.show()
'''
注意彼哼,如果加上以下兩行代碼童谒,那么最終生成的圖片如圖5所示,否則沪羔,圖片將以圖6的形式呈現(xiàn)出來饥伊。
color_list=["#FF0000","#FF0000","#DC143C"]
colormap=colors.ListedColormap(color_list)
這樣,一張帶有特定形狀的詞云圖就做出來了蔫饰。
最后琅豆,如果屏幕前的你對Python的可視化學(xué)習(xí)還有什么問題或看法,或者對本公眾號有什么建議篓吁,歡迎在公眾號:全哥的學(xué)習(xí)生涯茫因,內(nèi)給我留言,或者直接添加我的個(gè)人微信(公眾號內(nèi)菜單欄“與我聯(lián)系——聯(lián)系方式”可獲得)
感謝你的閱讀杖剪。