前言
本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。
作者:雁陎
如果你處於想學Python或者正在學習Python,Python的教程不少了吧,但是是最新的嗎?說不定你學了可能是兩年前人家就學過的內容,在這小編分享一波2020最新的Python教程。獲取方式,私信小編 “ 資料 ”,即可免費獲取哦!
前幾天做ppt,要展示的內容有很多關鍵詞,就想到了雲字圖這種玩意,沒想到網上一搜,在線生成的網站要麼需要付費,要麼不支持指定形狀生成,一氣之下乾脆自己寫了一個。幸好python有這個庫wordcloud,所以很快就實現了這個功能。後續優化了一下(渣優化),覺得基本能用了。
做好後的成果如下圖:
環境
所使用的版本爲python3.6.5(Anaconda)
- wordcloud 雲字圖生成庫
- matplotlib 繪圖庫,常和numpy一起使用
- numpy 數組函數庫,矩陣運算必用
- PIL 圖像操作模塊
- random 隨機數模塊
- jieba 中文分詞模塊
代碼
# -*- coding: utf-8 -*-
"""
Created on Fri Sep 29 13:14:22 2019
self.
@author: 雁陎
"""
from wordcloud import (WordCloud, ImageColorGenerator)
from matplotlib import pyplot as plt
import numpy as np
from PIL import Image
from random import randint
import jieba
lines=[]
with open('config.txt','r') as handler:
lines = handler.readlines()
a,b = map(int,lines[3].split(',')) # 顏色h的範圍
bgcolor = lines[7].strip('\n').lower() # 背景顏色
if bgcolor == 'none':
bgcolor = None
w,h = map(int,lines[9].split(',')) # 雲字圖尺寸
def font_select():
font_input = lines[5].strip('\n')
font_dict = {'微軟雅黑':r'\msyh.ttc','楷體':r'\simkai.ttf','宋體':r'\simsun.ttc',
'仿宋':r'\simfang.ttf','隸書':r'\SIMLI.TTF','Times New Roman':r'times.ttf'}
return r'C:\Windows\Fonts' + font_dict[font_input] # 字體
def shape_judge(): # 判斷用戶選擇的形狀
cloud_shape = lines[11].strip('\n').lower() # 雲字圖形狀
if cloud_shape == 'rectangle':
mask = None
elif cloud_shape == 'round':
x,y = np.ogrid[:w,:w]
mask = 255*((x-w/2) ** 2 + (y-w/2) ** 2 > 4.2*w ** 2).astype(int)
# 以(w/2,w/2)爲圓心,半徑爲4.2*w的圓,255不知道幹什麼的,但是必須有
else:
mask = np.array(Image.open(r"shape.jpg"))
return mask
def color_judge():
font_color_input = int(lines[1].strip('\n'))
if font_color_input == 1:
random_color = np.array(Image.open(r"shape.jpg"))
return ImageColorGenerator(random_color)
#字體顏色爲背景圖片的顏色
else:
def random_color_func(word=None, font_size=None, position=None,
orientation=None, font_path=None, random_state=None):
h,s,l = randint(a,b),randint(80,100),randint(25,50)
# h即表示顏色的取值範圍,我們可以谷歌colour picker 查看各顏色的取值範圍對應的h值
# 然後在參數中設置 color_func = random_color_func即可令字按照該範圍設定顏色
return "hsl({}, {}%, {}%)".format(h, s, l)
def segment_words(text):
article_contents = ""
#使用jieba進行分詞
words = jieba.cut(text,cut_all=False)
for word in words:
#使用空格來分割詞,否則詞組仍是一起的
article_contents += word+" "
return article_contents
def segment_judge(): # 判斷分詞模式
segment_mode = int(lines[13].strip('\n'))
text=open(u'word.txt','r').read().lower()
if segment_mode == 1:
return text
else:
return segment_words(text)
stopwords = {'.',',','"',':','(',')','.','。','(',')','[',']','”','“','\n','\t',' '}
wordcloud= WordCloud(font_path=font_select(), background_color=bgcolor, mode="RGBA",
color_func = color_judge(),mask= shape_judge(),width=w,
height=h,stopwords = stopwords,margin=2).generate(segment_judge())
# 你可以通過font path參數來設置字體集
# width, height, margin可以設置圖片屬性
# backgroud_color = "black",可以設定背景顏色,默認黑色,如果想要設定透明的可以按照上面代碼做
# stopwords 停用詞,即雲字圖中不展示的詞組,如各種標點、換行。
plt.axis("off") # 是否繪製座標軸
plt.show()
wordcloud.to_file('wordcloud.png')
配置文件
爲了方便用戶(也就是我)使用,所以配置了一個config.txt文件(不要吐槽txt,純小白~),代碼中所有的輸入均來自congfig。
# 1、字體顏色模式,可選:圖片顏色(1,按照即選項6中picture模式的圖片顏色進行繪製,選擇模式1就無需改動選項2,同時需保持選項6爲picture),自定義顏色(2,即自定義顏色的範圍,需要設定選項2)
2
# 2、字體顏色H的取值範圍,參見https://www.webfx.com/web-design/color-picker/
40,80
# 3、字體,可選:微軟雅黑,楷體,宋體,仿宋,隸書,Times New Roman
微軟雅黑
# 4、背景顏色,英文書寫如white,默認爲透明(None)
None
# 5、雲字圖尺寸,寬,高
1000,800
# 6、雲字圖形狀,可選:方形(rectangle,尺寸爲寬,高),圓形(round,尺寸爲寬,寬),或圖片形狀(picture,按照同目錄下shape.jpg的形狀繪製,尺寸爲圖片尺寸)
picture
# 7、分詞模式,可選:自定義模式(1,即按照你所給的詞組進行繪製,詞組之間用空格分隔),自動分詞模式(2,即給定一段話,程序自動進行分詞並按照頻率進行繪製)
1
使用
你的項目目錄中應該有以下文件:
雲字圖生成
config.txt
shape.jpg
word.txt
雲字圖生成.py
其中,shape.jpg是所選定的圖片形狀,在config中設定選項6爲picture後會按照這個圖片的形狀來生成雲字圖。
shape最好背景爲白色,這樣效果最好。
說到這裏,你能看出來文章開頭的效果圖是誰嗎?
猜猜他是誰
常見問題
有個很常見的問題就是我的字體該如何配置,如果你實際操作起來就會發現,“誒我明明指向了Font文件夾中的微軟雅黑.ttf”,爲什麼報錯說沒有這個字體呢?
很簡單,因爲你在font中看到的字體名並不是它真正的字體名,比如“微軟雅黑”實際上是“msyh”。那麼我該如何查看它真實的文件名?一個方便的做法是把它複製到桌面上,它就會自動顯示真正的名字了。
哦對了font文件夾的地址是C:\Windows\Fonts
地址欄拼接的時候報錯
大家可以看到在拼接字體文件字符串的時候用的是r'C:\Windows\Fonts'+r'\SIMLI.TTF'而非r'C:\Windows\Fonts\' & r'SIMLI.TTF',因爲當字符串最後一位是\時,無法對字符串進行拼接等操作,即使用r'轉義也不行,會報錯SyntaxError: EOL while scanning string literal。這貌似是python的一個bug,解決方法如上,\放到第二個字符串開頭即可。
如果你處於想學Python或者正在學習Python,Python的教程不少了吧,但是是最新的嗎?說不定你學了可能是兩年前人家就學過的內容,在這小編分享一波2020最新的Python教程。獲取方式,私信小編 “ 資料 ”,即可免費獲取哦!