Python數(shù)據(jù)可視化:WordCloud+GUI

之前寫過一篇WordCloud入門,里面寫了生成WordCloud的一般方法韭邓,包括參數(shù)設(shè)計和形狀修改等等

標(biāo)簽云效果圖--基礎(chǔ)

在上一次的基礎(chǔ)上拓轻,這次用easygui做了一個界面

先展示一下界面,代碼在最后

輸入文字信息

選擇需要輸入的內(nèi)容
顯示所選文字

生成WordCloud

生成WordCloud

這是默認(rèn)圖像台妆,可選擇是否要繼續(xù)優(yōu)化
繼續(xù)優(yōu)化參數(shù):進(jìn)入后續(xù)優(yōu)化
直接保存圖像:退出程序,圖像保存在代碼相對應(yīng)的文件夾

繼續(xù)優(yōu)化

設(shè)置指定形狀
選擇你要的圖片
是否和圖片顏色保持一致
參數(shù)設(shè)置

根據(jù)上述選擇結(jié)果胖翰,這里可以看到你選擇的輪廓參照文件圖片順色情況接剩,你依舊可以改動這些參數(shù)

根據(jù)剛剛的選擇,我們得到新的WordCloud

此時的圖像顯示會模糊一些萨咳,實際保存的圖像太大了懊缺,在顯示的時候,我降低了像素(不影響實際結(jié)果)

在這個結(jié)果上培他,可以繼續(xù)點擊繼續(xù)優(yōu)化參數(shù)鹃两,重復(fù)以上步驟,設(shè)置新的參數(shù)

調(diào)整完畢后舀凛,點擊直接保存圖像
此時俊扳,就會保存高清的圖像到你的文件夾

實際圖像

代碼說明

這個程序,還是有很多可以優(yōu)化的地方

  • 剔除不要的單詞
  • 預(yù)設(shè)長方形猛遍、正方形馋记、圓形
  • 將顏色設(shè)為選項,而不是需要填寫
  • 后續(xù)慢慢優(yōu)化

代碼主要思路

fileopenbox打開txt的對話框

import easygui as g
path_text = g.fileopenbox(title = '請選擇需要輸入的內(nèi)容(后綴為.txt)', default="*.txt")

顯示txt內(nèi)容

msg='文件內(nèi)容如下:'
title='顯示文件內(nèi)容'
text = open(path_text, encoding='utf-8').read()
g.textbox(msg,title,text)

精確切割中文字符(這樣保證中英文都可以使用)
如果只要用英文懊烤,那這一步可以省略

text = ' '.join(jieba.cut(text, cut_all = False))

設(shè)置默認(rèn)WordCloud參數(shù)

fieldValues = [
               'C:/Windows/Fonts/simfang.ttf',    # 字體路徑
               100,    # 顯示詞數(shù)
               100,    # 最大字號
               'white',    # 背景色
               0,    # 輪廓寬度
               'steelblue',    # 輪廓顏色
               'False',    # 輪廓參照
               'False'    # 和圖片順色
             ]  
wc =  SetWordCloud(fieldValues)  

生成初步圖像

wc.generate(text)
wc.to_file('image.png')  # 儲存圖像

判斷是否要優(yōu)化

def IfContinue(WC_continue, path_image, fieldValues)  # 是否要繼續(xù)優(yōu)化

不優(yōu)化梯醒,直接保存高清圖像
優(yōu)化,繼續(xù)下一步

如果指定了背景形狀

def Para_mask(fieldValues)   # 指定圖片形狀和顏色
def Para(values)  # 修改其他參數(shù)
def SetWordCloudMask(mask_coloring, fieldValues)

如果不指定背景形狀

def Para(values)  # 修改其他參數(shù)
def SetWordCloud(fieldValues)

根據(jù)參數(shù)奸晴,生成圖像

完整代碼

import os
from os import path
# from matplotlib import pyplot as plt
import jieba
import easygui as g
import numpy as np
from PIL import Image
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator

# 用戶設(shè)定初始值
def Para(values):
    msg  =  "你可以修改下面的默認(rèn)參數(shù)" 
    title  =  "參數(shù)設(shè)置"
    fieldNames = [
                    "字體路徑" ,  # fieldValues[0]
                    "顯示詞數(shù)",  # fieldValues[1]
                    "最大字號" ,  # fieldValues[2]
                    "背景色",  # fieldValues[3]
                    "輪廓寬度",  # fieldValues[4]
                    "輪廓顏色",  # fieldValues[5]
                    "輪廓參照",  # fieldValues[6]
                    "和圖片順色"     # fieldValues[7]                                 
                    ] 
    fieldValues  =  []  
    fieldValues  =  g.multenterbox (msg, title, fieldNames,values = values)
    return fieldValues

# 用戶設(shè)定初始值-背景輪廓和顏色
def Para_mask(fieldValues):
    d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
    mask_image = path.join(d,'mask.jpg')
    if_mask = g.buttonbox("需要指定形狀嗎冤馏?\n默認(rèn)是長方形\n你可以輸入一張圖片作為輪廓", image = mask_image,choices=("需要","不需要"))
    if if_mask == "需要":
        fieldValues[6] = g.fileopenbox(msg = '后綴為圖片格式', title = '設(shè)置mask路徑', default="*.png")
        #mask = np.array(Image.open(path_mask))
        color_image = path.join(d,'colored.png')
        if_color = g.buttonbox("需要和圖片順色嗎?左邊是不順色寄啼,中間是順色逮光,右邊是原圖", image = color_image, choices=("需要","不需要"))
        if if_color == "需要":
            fieldValues[7] = 'True'
        else:
            fieldValues[7] = 'False'  
    else:
        fieldValues[6] = 'False'  
            
    return fieldValues

# 是否需要繼續(xù)優(yōu)化參數(shù)
def IfContinue(WC_continue, path_image, fieldValues):
    
    if WC_continue == "繼續(xù)優(yōu)化參數(shù)" :
        fieldValues = Para_mask(fieldValues)
        fieldValues = Para(fieldValues)
        if fieldValues[6] == 'False':
            wc =  SetWordCloud(fieldValues)  
            wc.generate(text)
            wc.to_file('image.png')  # 儲存圖像
            WC_continue = g.buttonbox(title="顯示圖像",msg='是否需要優(yōu)化', image = path_image, choices=("繼續(xù)優(yōu)化參數(shù)","直接保存圖像"))
            IfContinue(WC_continue, path_image, fieldValues)
        else:
            # 讀取圖片文件
            mask_coloring = np.array(Image.open(fieldValues[6]))
            wc =  SetWordCloudMask(mask_coloring, fieldValues) 
            wc.generate(text)
            if fieldValues[7] == 'False':
                wc.to_file('image.png')  # 儲存圖像
                # 調(diào)整圖像顯示大小
                im = Image.open(path_image)
                (x,y) = im.size #read image size
                y_s = 500 #define standard width
                x_s = int(x*y_s/y) #calc height based on standard width
                im = im.resize((x_s,y_s)) #resize image with high-quality
                im .save('image.png')
                WC_continue = g.buttonbox(title="顯示圖像",msg='是否需要優(yōu)化', image = path_image, choices=("繼續(xù)優(yōu)化參數(shù)","直接保存圖像"))
                wc.to_file('image.png')  # 儲存圖像
                IfContinue(WC_continue, path_image, fieldValues)
            else:
                # 根據(jù)圖片,創(chuàng)建顏色
                image_colors = ImageColorGenerator(mask_coloring)
                # 儲存圖像
                wc.recolor(color_func = image_colors).to_file('image.png') 
            
                # 調(diào)整圖像顯示大小
                im = Image.open(path_image)
                (x,y) = im.size #read image size
                y_s = 500 #define standard width
                x_s = int(x*y_s/y) #calc height based on standard width
                im = im.resize((x_s,y_s)) #resize image with high-quality
                im .save('image.png')
                WC_continue = g.buttonbox(title = "顯示圖像",msg = '是否需要優(yōu)化', image = path_image, choices=("繼續(xù)優(yōu)化參數(shù)","直接保存圖像"))
                wc.recolor(color_func = image_colors).to_file('image.png') 
                IfContinue(WC_continue, path_image, fieldValues)

# 設(shè)置WordCloud參數(shù)墩划,生成詞云
def SetWordCloud(fieldValues):  
    wc = WordCloud(
            font_path = fieldValues[0],  #字體路徑
            scale = 2,
            max_words = int(fieldValues[1]), #最多詞個數(shù)
            max_font_size = int(fieldValues[2]),  #最大字號
            background_color = fieldValues[3],  #背景色
            contour_width = int(fieldValues[4]),  #設(shè)置輪廓寬度
            contour_color = fieldValues[5]  #設(shè)置輪廓顏色     
            )
    return wc

# 設(shè)置WordCloud參數(shù)涕刚,生成詞云
def SetWordCloudMask(mask_coloring, fieldValues):   
    wc = WordCloud(
            font_path = fieldValues[0],  #字體路徑
            scale = 2,
            max_words = int(fieldValues[1]), #最多詞個數(shù)
            max_font_size = int(fieldValues[2]),  #最大字號
            background_color = fieldValues[3],  #背景色
            contour_width = int(fieldValues[4]),  #設(shè)置輪廓寬度
            contour_color = fieldValues[5],  #設(shè)置輪廓顏色
            mask = mask_coloring          
            )
    return wc

# 選擇要輸入的文件
path_text = g.fileopenbox(title = '請選擇需要輸入的內(nèi)容(后綴為.txt)', default="*.txt")

# 顯示文件
msg='文件內(nèi)容如下:'
title='顯示文件內(nèi)容'
text = open(path_text, encoding='utf-8').read()
g.textbox(msg,title,text)

# 精確切割中文字符
text = ' '.join(jieba.cut(text, cut_all = False))

# 默認(rèn)參數(shù)
fieldValues = [
               'C:/Windows/Fonts/simfang.ttf',
               100,
               100,
               'white',
               0,
               'steelblue',
               'False',
               'False'
             ]  
 
wc =  SetWordCloud(fieldValues)  

wc.generate(text)
wc.to_file('image.png')  # 儲存圖像

# 獲取當(dāng)前文件路徑
d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
# 獲取文本txt的路徑(txt和代碼在一個路徑下面)
path_image = path.join(d,'image.png')
WC_continue = g.buttonbox(title="顯示圖像",msg='是否需要優(yōu)化', image = path_image, choices=("繼續(xù)優(yōu)化參數(shù)","直接保存圖像"))
IfContinue(WC_continue, path_image, fieldValues)
···
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市乙帮,隨后出現(xiàn)的幾起案子杜漠,更是在濱河造成了極大的恐慌,老刑警劉巖察净,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驾茴,死亡現(xiàn)場離奇詭異,居然都是意外死亡氢卡,警方通過查閱死者的電腦和手機(jī)锈至,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來译秦,“玉大人峡捡,你說我怎么就攤上這事≈玻” “怎么了们拙?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長阁吝。 經(jīng)常有香客問我砚婆,道長,這世上最難降的妖魔是什么突勇? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任射沟,我火速辦了婚禮,結(jié)果婚禮上与境,老公的妹妹穿的比我還像新娘验夯。我一直安慰自己,他們只是感情好摔刁,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布挥转。 她就那樣靜靜地躺著,像睡著了一般共屈。 火紅的嫁衣襯著肌膚如雪绑谣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天拗引,我揣著相機(jī)與錄音借宵,去河邊找鬼。 笑死矾削,一個胖子當(dāng)著我的面吹牛壤玫,可吹牛的內(nèi)容都是我干的豁护。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼欲间,長吁一口氣:“原來是場噩夢啊……” “哼楚里!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起猎贴,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤班缎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后她渴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體达址,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年趁耗,在試婚紗的時候發(fā)現(xiàn)自己被綠了沉唠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡对粪,死狀恐怖右冻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情著拭,我是刑警寧澤纱扭,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站儡遮,受9級特大地震影響乳蛾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鄙币,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一肃叶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧十嘿,春花似錦因惭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咳燕,卻和暖如春勿决,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背招盲。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工低缩, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人曹货。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓咆繁,卻偏偏與公主長得像讳推,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子么介,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355