用 Python 實現詞雲可視化

2021-03-06 Python那些事

(點擊上方快速關注並設置為星標,一起學Python)

作者:沂水寒城    來源:

https://blog.csdn.net/Together_CZ/article/details/92764128

詞雲是一種非常漂亮的可視化展示方式,正所謂一圖勝過千言萬語,詞雲在之前的項目中我也有過很多的使用,可能對於我來說,一種很好的自我介紹方式就是詞雲吧,就像下面這樣的:

個人覺還是會比枯燥的文字語言描述性的介紹會更吸引人一點吧。

今天不是說要怎麼用詞雲來做個人介紹,而是對工作中使用到比較多的詞雲計較做了一下總結,主要是包括三個方面:

1、諸如上面的簡單形式矩形詞雲

2、基於背景圖片數據來構建詞雲數據

3、某些場景下不想使用類似上面的默認的字體顏色,這裡可以自定義詞雲的字體顏色

接下來對上面三種類型的詞雲可視化方法進行demo實現與展示,具體如下,這裡我們使用到的測試數據如下:

The Zen of Python, by Tim Peters
            Beautiful is better than ugly.
        Explicit is better than implicit.
        Simple is better than complex.
        Complex is better than complicated.
        Flat is better than nested.
        Sparse is better than dense.
        Readability counts.
        Special cases aren't special enough to break the rules.
        Although practicality beats purity.
        Errors should never pass silently.
        Unless explicitly silenced.
        In the face of ambiguity, refuse the temptation to guess.
        There should be one-- and preferably text one --obvious way to do it.
        Although that way may not be obvious at first unless you're Dutch.
        Now is better than never.
        Although never is often better than *right* now.
        If the implementation is hard to explain, it's a bad idea.
        If the implementation is easy to explain, it may be a good idea.
        Namespaces are one honking great idea -- let's do more of those!

1、簡單形式矩形詞雲實現如下:

def simpleWC1(sep=' ',back='black',freDictpath='data_fre.json',savepath='res.png'):
    '''
    詞雲可視化Demo
    '''
    try:
        with open(freDictpath) as f:
            data=f.readlines()
            data_list=[one.strip().split(sep) for one in data if one]
        fre_dict={}
        for one_list in data_list:
            fre_dict[unicode(one_list[0])]=int(one_list[1])
    except:
        fre_dict=freDictpath
    wc=WordCloud(font_path='font/simhei.ttf',#設置字體  #simhei
                background_color=back, #背景顏色
                max_words=1300,# 詞雲顯示的最大詞數
                max_font_size=120, #字體最大值
                margin=3,  #詞雲圖邊距
                width=1800,  #詞雲圖寬度
                height=800,  #詞雲圖高度
                random_state=42)
    wc.generate_from_frequencies(fre_dict)  #從詞頻字典生成詞雲
    plt.figure()  
    plt.imshow(wc)
    plt.axis("off")
    wc.to_file(savepath)

圖像數據結果如下:

2、 基於背景圖像數據的詞雲可視化具體實現如下:

先貼一下背景圖像:

這也是一個比較經典的圖像數據了,下面來看具體的實現:

def simpleWC2(sep=' ',back='black',backPic='a.png',freDictpath='data_fre.json',savepath='res.png'):
    '''
    詞雲可視化Demo【使用背景圖片】
    '''
    try:
        with open(freDictpath) as f:
            data=f.readlines()
            data_list=[one.strip().split(sep) for one in data if one]
        fre_dict={}
        for one_list in data_list:
            fre_dict[unicode(one_list[0])]=int(one_list[1])
    except:
        fre_dict=freDictpath
    back_coloring=imread(backPic)
    wc=WordCloud(font_path='simhei.ttf',#設置字體  #simhei
                background_color=back,max_words=1300,
                mask=back_coloring,#設置背景圖片
                max_font_size=120, #字體最大值
                margin=3,width=1800,height=800,random_state=42,)
    wc.generate_from_frequencies(fre_dict)  #從詞頻字典生成詞雲
    wc.to_file(savepath)

結果圖像數據如下:

3、 自定義詞雲字體顏色的具體實現如下:

#自定義顏色列表
color_list=['#CD853F','#DC143C','#00FF7F','#FF6347','#8B008B','#00FFFF','#0000FF','#8B0000','#FF8C00',
            '#1E90FF','#00FF00','#FFD700','#008080','#008B8B','#8A2BE2','#228B22','#FA8072','#808080']


def simpleWC3(sep=' ',back='black',freDictpath='data_fre.json',savepath='res.png'):
    '''
    詞雲可視化Demo【自定義字體的顏色】
    '''
    #基於自定義顏色表構建colormap對象
    colormap=colors.ListedColormap(color_list)  
    try:
        with open(freDictpath) as f:
            data=f.readlines()
            data_list=[one.strip().split(sep) for one in data if one]
        fre_dict={}
        for one_list in data_list:
            fre_dict[unicode(one_list[0])]=int(one_list[1])
    except:
        fre_dict=freDictpath
    wc=WordCloud(font_path='font/simhei.ttf',#設置字體  #simhei
                background_color=back,  #背景顏色
                max_words=1300,  #詞雲顯示的最大詞數
                max_font_size=120,  #字體最大值
                colormap=colormap,  #自定義構建colormap對象
                margin=2,width=1800,height=800,random_state=42,
                prefer_horizontal=0.5)  #無法水平放置就垂直放置
    wc.generate_from_frequencies(fre_dict)
    plt.figure()  
    plt.imshow(wc)
    plt.axis("off")
    wc.to_file(savepath)

結果圖像數據如下:

上述三種方法就是我在具體工作中使用頻度最高的三種詞雲可視化展示方法了,下面貼出來完整的代碼實現,可以直接拿去跑的:

#!usr/bin/env python
#encoding:utf-8
from __future__ import division

'''
__Author__:沂水寒城
功能: 詞雲的可視化模塊
'''

import os
import sys
import json
import numpy as np
from PIL import Image
from scipy.misc import imread
from matplotlib import colors
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from wordcloud import WordCloud,ImageColorGenerator,STOPWORDS

reload(sys)
sys.setdefaultencoding('utf-8')

#自定義顏色列表
color_list=['#CD853F','#DC143C','#00FF7F','#FF6347','#8B008B','#00FFFF','#0000FF','#8B0000','#FF8C00',
            '#1E90FF','#00FF00','#FFD700','#008080','#008B8B','#8A2BE2','#228B22','#FA8072','#808080']



def simpleWC1(sep=' ',back='black',freDictpath='data_fre.json',savepath='res.png'):
    '''
    詞雲可視化Demo
    '''
    try:
        with open(freDictpath) as f:
            data=f.readlines()
            data_list=[one.strip().split(sep) for one in data if one]
        fre_dict={}
        for one_list in data_list:
            fre_dict[unicode(one_list[0])]=int(one_list[1])
    except:
        fre_dict=freDictpath
    wc=WordCloud(font_path='font/simhei.ttf',#設置字體  #simhei
                background_color=back, #背景顏色
                max_words=1300,# 詞雲顯示的最大詞數
                max_font_size=120, #字體最大值
                margin=3,  #詞雲圖邊距
                width=1800,  #詞雲圖寬度
                height=800,  #詞雲圖高度
                random_state=42)
    wc.generate_from_frequencies(fre_dict)  #從詞頻字典生成詞雲
    plt.figure()  
    plt.imshow(wc)
    plt.axis("off")
    wc.to_file(savepath)


def simpleWC2(sep=' ',back='black',backPic='a.png',freDictpath='data_fre.json',savepath='res.png'):
    '''
    詞雲可視化Demo【使用背景圖片】
    '''
    try:
        with open(freDictpath) as f:
            data=f.readlines()
            data_list=[one.strip().split(sep) for one in data if one]
        fre_dict={}
        for one_list in data_list:
            fre_dict[unicode(one_list[0])]=int(one_list[1])
    except:
        fre_dict=freDictpath
    back_coloring=imread(backPic)
    wc=WordCloud(font_path='simhei.ttf',#設置字體  #simhei
                background_color=back,max_words=1300,
                mask=back_coloring,#設置背景圖片
                max_font_size=120, #字體最大值
                margin=3,width=1800,height=800,random_state=42,)
    wc.generate_from_frequencies(fre_dict)  #從詞頻字典生成詞雲
    wc.to_file(savepath)


def simpleWC3(sep=' ',back='black',freDictpath='data_fre.json',savepath='res.png'):
    '''
    詞雲可視化Demo【自定義字體的顏色】
    '''
    #基於自定義顏色表構建colormap對象
    colormap=colors.ListedColormap(color_list)  
    try:
        with open(freDictpath) as f:
            data=f.readlines()
            data_list=[one.strip().split(sep) for one in data if one]
        fre_dict={}
        for one_list in data_list:
            fre_dict[unicode(one_list[0])]=int(one_list[1])
    except:
        fre_dict=freDictpath
    wc=WordCloud(font_path='font/simhei.ttf',#設置字體  #simhei
                background_color=back,  #背景顏色
                max_words=1300,  #詞雲顯示的最大詞數
                max_font_size=120,  #字體最大值
                colormap=colormap,  #自定義構建colormap對象
                margin=2,width=1800,height=800,random_state=42,
                prefer_horizontal=0.5)  #無法水平放置就垂直放置
    wc.generate_from_frequencies(fre_dict)
    plt.figure()  
    plt.imshow(wc)
    plt.axis("off")
    wc.to_file(savepath)



if __name__ == '__main__':
    text="""
        The Zen of Python, by Tim Peters
        Beautiful is better than ugly.
        Explicit is better than implicit.
        Simple is better than complex.
        Complex is better than complicated.
        Flat is better than nested.
        Sparse is better than dense.
        Readability counts.
        Special cases aren't special enough to break the rules.
        Although practicality beats purity.
        Errors should never pass silently.
        Unless explicitly silenced.
        In the face of ambiguity, refuse the temptation to guess.
        There should be one-- and preferably text one --obvious way to do it.
        Although that way may not be obvious at first unless you're Dutch.
        Now is better than never.
        Although never is often better than *right* now.
        If the implementation is hard to explain, it's a bad idea.
        If the implementation is easy to explain, it may be a good idea.
        Namespaces are one honking great idea -- let's do more of those!
        """
    word_list=text.split()
    fre_dict={}
    for one in word_list:
        if one in fre_dict:
            fre_dict[one]+=1
        else:
            fre_dict[one]=1
    simpleWC1(sep=' ',back='black',freDictpath=fre_dict,savepath='simpleWC1.png')
    simpleWC2(sep=' ',back='black',backPic='backPic/A.png',freDictpath=fre_dict,savepath='simpleWC2.png')
    simpleWC3(sep=' ',back='black',freDictpath=fre_dict,savepath='simpleWC3.png')

(完)

看完本文有收穫?請轉發分享給更多人

關注「Python那些事」,做全棧開發工程師

相關焦點

  • 數據統計可視化——python生成詞雲
    如何統計文章詞頻,從而更快了解一篇文章所獲得的中文詞頻統計數據進行詞雲可視化展示,更加清晰的看到文章關鍵詞的權重詞雲庫WordCloudwordcloud庫,可以說是python非常優秀的詞雲展示第三方庫。詞雲以詞語為基本單位更加直觀和藝術的展示文本而且使用簡單,內容豐富,先看看它生成的詞雲是什麼樣的。
  • 數據可視化 | 用Python生成個性化詞雲
    接下來將介紹如何使用python生成個性化詞雲。最關鍵的使用WordCloud模塊,要使用WordCloud模塊,需要先進行安裝。接下來將使用自定義形狀,而不是矩形形狀,可以導入一張圖片作為詞雲的形狀。
  • 一種用Python生成詞雲
    一種用Python生成詞雲我們在閱讀一篇很長的文章時,總先看看文章的關鍵詞來獲知文章的大概內容。今天我們就來製作一個詞雲程序,將文章中出現次數較多的詞語提取出來,生成一張詞雲圖。在pycharm中新建一個python文件。首先調用jieba 和worldcloud模塊。
  • 彈幕、詞雲、面積圖,最全文字可視化教程來啦!
    之前課代表帶給大家的教程多是圍繞數字的可視化,今天我們想來講講文字如何實現可視化。一般來說,相比冗長的文字,色彩斑斕的圖片都更吸引人。但文字也可以在不丟失本身意義的基礎上進行可視化表達。、氣泡圖、沃羅諾伊樹狀圖,甚至是不規則圖形來可視化,這些合稱為面積法,也就是用面積來表達文字數量的多少。
  • 軟體推薦 7款免費的詞雲可視化工具,圖表控沒有理由拒絕
    7款免費的詞雲可視化工具,圖表控沒有理由拒絕來源:http://www.afenxi.com/post/23953
  • 給閱讀充分的想像空間和娛樂趣味 | python詞雲
    1.python詞雲模塊的安裝製作詞雲的主要模塊為 「wordcloud」,另外,要使用 「jieba」 庫切割中文句子,用 「imageio」 讀入圖片。只要簡單改變上述創建 WordCloud 對象的代碼,即可得到不同背景顏色的詞云:# example2.py# 設置背景顏色為白色wc = WordCloud(background_color='white')python還支持很多顏色,下表列出了一部分,有興趣的讀者可自行嘗試:製作中文詞雲
  • 【Python教程】用Python進行數據可視化
    因此,我們的要求功能的實現,更是要多去思考不同的解決方案,評估不同方案的優劣,然後使用在該場景下最優雅的方式去實現。所以,我們列出的參考資料未必是實現需求所必須的。有的時候,實現題目的要求很簡單,甚至參考資料裡就有,但是背後的思考和親手去實踐卻是任務最關鍵的一部分。在學習這些資料時,要多思考,多提問,多質疑。相信通過和小夥伴們的交流,能讓你的學習事半功倍。
  • 使用python生成詞雲
    今天和大家分享一下如何使用python生成詞雲,在製作詞雲之前,我們首先需要一個用於製作詞雲的數據和形狀的模板,本篇文章以長安十二時辰的txt文件和中國地圖為例。具體代碼如下:#打開文件txt=open(".
  • 使用Jieba庫分分鐘實現高端大氣的詞雲
    實現思路利用python的jieba庫對文本進行分詞及詞頻統計,然後通過在線製作詞雲工具TAGUL,製作詞雲。下面以《鬥破蒼穹》小說為例,利用Jieba庫實現分詞。三十年河東,三十年河西,莫欺少年窮!實現步驟jieba分詞(1)通過pip3 install jieba安裝jieba庫(2)隨後在網上下載《鬥破蒼穹》小說(TXT文檔)及停用詞表。
  • 手把手教你怎麼做一個詞雲
    用簡單的話來說,詞雲就是把一大段文字中的關鍵詞提取出來,做成一張圖,並按照出現的次數多少,決定關鍵詞在結果圖上的大小。接下來,小編就教小夥伴們做出一個自定義形狀的詞雲。Python提供了用於實現詞雲功能的第三方庫wordcloud(直接使用pip命令安裝即可),該庫以文本中詞語出現的頻率作為參數來繪製詞雲,並支持對詞雲的形狀、顏色和大小等屬性進行設置。利用wordcloud庫生成詞雲一般分為三個步驟:利用WordCloud類的構造方法WordCloud()創建詞雲對象。
  • Python爬取腳本之家生成詞雲
    出品 | 腳本之家(ID:jb51net)在工作生活中,當我們遇到想展示關鍵詞的場合時,用詞雲的方式展示是一個不錯的方法。但是如何去實現詞雲呢?這樣的可視化展示方式,不僅直觀,而且美觀。那麼如何快速生成一個詞雲呢?
  • 用Python進行數據可視化的10種方法
    他們用數據可視化的方式繪畫,試圖展現數據內隱藏的模式或表達對數據的見解。更有趣的是,一旦接觸到任何可視化的內容、數據時,人類會有更強烈的知覺、認知和交流。 在數據科學中,有多種工具可以進行可視化。在本文中,我展示了使用Python來實現的各種可視化圖表。 怎樣才能在Python中實現可視化? 涉及到的東西並不多!
  • 從零開始教你用 Python 做詞雲
    今天我們要嘗試的,是用通用的程式語言Python來做詞雲。Python是一種時下很流行的程式語言。你不僅可以用它做數據分析和可視化,還能用來做網站、爬取數據、做數學題、寫腳本替你偷懶……知道豆瓣嗎?它一開始就是用Python寫的。在目前的程式語言熱度排序裡,Python屈居第四(當然,很多人不同意,所以程式語言的排行榜有許多,你懂的)。
  • 用Python構建和可視化決策樹
    步驟2:導入數據和EDA在這一步中,我們將使用python中提供的「Pandas」包來導入並在其上進行一些EDA。我們將建立我們的決策樹模型,數據集是一個藥物數據集,它是基於特定的標準給病人開的處方。讓我們用python導入數據!
  • python生成詞雲時,文件名與庫名重出現的錯誤提示
    近日在vs code做一個python詞雲的練習時,編譯時出現:AttributeError: module 'wordcloud' has no attribute 'WordCloud'的提示,python3.8環境下,已經安排wordcloud
  • 想用Python做數據可視化?先邁過這個「坎」
    python的人都會面臨一個問題,尤其是初學者:我應該選哪個來實現數據可視化?其實,在大多數情況下,可視化工具可以在沒有pandas的情況下使用,但pandas+可視化工具的組合很常見,這是一個很好的起始點。 pandas 我通常會用pandas DataFrame開始製作各種繪圖的工作。這樣有一個優勢,就是pandas提供內置的繪圖功能,它是matplotlib之上的一層。
  • 拿來就用能的Python詞雲圖代碼|wordcloud生成詞雲詳解
    詞雲也叫文字雲,是一種可視化的結果呈現,常用在爬蟲數據分析中,原理就是統計文本中高頻出現的詞,過濾掉某些幹擾詞,將結果生成一張圖片,直觀的獲取數據的重點信息。今天,我們就來學習一下Python生成詞雲的常用庫「wordcloud」。
  • Python如何生成詞雲(詳解)
    我的解決方法是直接訪問下面的網址,根據你的電腦和py版本下載對應的whl文件https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloudpath_img = "C://Users/Administrator/Desktop/timg.jpg"    f = open(path_txt, 'r', encoding='UTF-8').read()    background_image = np.array(Image.open(path_img))    # 結巴分詞,生成字符串,如果不通過分詞,無法直接生成正確的中文詞雲
  • 【python】Tkinter可視化窗口(三)
    精彩知識回顧前兩個Tkinter文章為:【python】Tkinter可視化窗口一【python】Tkinter窗口可視化二from_和to:表示從from_的值到to的值,用from_而不用from的原因是from是python的關鍵字!
  • Python的可視化工具概述
    >ggplotBokehpygalPlotly在例子用,我將使用pandas操作數據,並啟動其可視化.在大多數情況下使用這些工具不需要pandas,但是我覺得pandas+可視化工具如此普遍,這是最好的起點。