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

之前寫(xiě)過(guò)一篇WordCloud入門(mén),里面寫(xiě)了生成WordCloud的一般方法,包括參數(shù)設(shè)計(jì)和形狀修改等等

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

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

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

輸入文字信息

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

生成WordCloud

生成WordCloud

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

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

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

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

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

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

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

調(diào)整完畢后,點(diǎn)擊直接保存圖像
此時(shí),就會(huì)保存高清的圖像到你的文件夾

實(shí)際圖像

代碼說(shuō)明

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

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

代碼主要思路

fileopenbox打開(kāi)txt的對(duì)話框

import easygui as g
path_text = g.fileopenbox(title = '請(qǐng)選擇需要輸入的內(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,    # 最大字號(hào)
               'white',    # 背景色
               0,    # 輪廓寬度
               'steelblue',    # 輪廓顏色
               'False',    # 輪廓參照
               'False'    # 和圖片順色
             ]  
wc =  SetWordCloud(fieldValues)  

生成初步圖像

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

判斷是否要優(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]
                    "最大字號(hào)" ,  # 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)是長(zhǎng)方形\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')  # 儲(chǔ)存圖像
            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')  # 儲(chǔ)存圖像
                # 調(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')  # 儲(chǔ)存圖像
                IfContinue(WC_continue, path_image, fieldValues)
            else:
                # 根據(jù)圖片,創(chuàng)建顏色
                image_colors = ImageColorGenerator(mask_coloring)
                # 儲(chǔ)存圖像
                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]), #最多詞個(gè)數(shù)
            max_font_size = int(fieldValues[2]),  #最大字號(hào)
            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]), #最多詞個(gè)數(shù)
            max_font_size = int(fieldValues[2]),  #最大字號(hào)
            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 = '請(qǐng)選擇需要輸入的內(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')  # 儲(chǔ)存圖像

# 獲取當(dāng)前文件路徑
d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
# 獲取文本txt的路徑(txt和代碼在一個(gè)路徑下面)
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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容