各参数解释(部分)
font_path : string #字体路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = '黑体.ttf'
width : int (default=400) #输出的画布宽度,默认为400像素
height : int (default=200) #输出的画布高度,默认为200像素
prefer_horizontal : float (default=0.90) #词语水平方向排版出现的频率,默认 0.9 (所以词语垂直方向排版出现频率为 0.1 )
mask : nd-array or None (default=None) #如果参数为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。如:bg_pic = imread('读取一张图片.png'),背景图片的画布一定要设置为白色(#FFFFFF),然后显示的形状为不是白色的其他颜色。可以用ps工具将自己要显示的形状复制到一个纯白色的画布上再保存,就ok了。
scale : float (default=1) #按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍
min_font_size : int (default=4) #显示的最小的字体大小
font_step : int (default=1) #字体步长,如果步长大于1,会加快运算但是可能导致结果出现较大的误差
max_words : number (default=200) #要显示的词的最大个数
stopwords : set of strings or None #设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS
background_color : color value (default=”black”) #背景颜色,如background_color='white',背景颜色为白色
max_font_size : int or None (default=None) #显示的最大的字体大小
mode : string (default=”RGB”) #当参数为“RGBA”并且background_color不为空时,背景为透明
relative_scaling : float (default=.5) #词频和字体大小的关联性
color_func : callable, default=None #生成新颜色的函数,如果为空,则使用 self.color_func
regexp : string or None (optional) #使用正则表达式分隔输入的文本
collocations : bool, default=True #是否包括两个词的搭配
colormap : string or matplotlib colormap, default=”viridis” #给每个单词随机分配颜色,若指定color_func,则忽略该方法
random_state : int or None #为每个单词返回一个PIL颜色
fit_words(frequencies) #根据词频生成词云
generate(text) #根据文本生成词云
generate_from_frequencies(frequencies[, ...]) #根据词频生成词云
generate_from_text(text) #根据文本生成词云
process_text(text) #将长文本分词并去除屏蔽词(此处指英语,中文分词还是需要自己用别的库先行实现,使用上面的 fit_words(frequencies) )
recolor([random_state, color_func, colormap]) #对现有输出重新着色。重新上色会比重新生成整个词云快很多
to_array() #转化为 numpy array
to_file(filename) #输出到文件
具体实现
1.jpg
import numpy as np
import matplotlib.pyplot as plt
#pip install WordCloud
from wordcloud import WordCloud,STOPWORDS
from PIL import Image
from os import path
import cv2
import matplotlib.pyplot as plt
#用来正常显示中文
plt.rcParams["font.sans-serif"]=["SimHei"]
#用来正常显示负号
plt.rcParams["axes.unicode_minus"]=False
import os
#pip install jieba
import random,jieba
'''
绘制单个词一个圆形的词云(设置每个值的权重)
'''
def single_wordColud_1():
text = {"第一":0.1,"第二":0.2,"第三":0.3,"第四":0.4}
#产生一个以(150,150)为圆心,半径为130的圆形mask
x,y = np.ogrid[:300,:300]
mask = (x-150) ** 2 + (y-150) ** 2 > 130 ** 2
mask = 255 * mask.astype(int)
wc = WordCloud(background_color="white",font_path='./simkai.ttf',repeat=True,mask=mask)
wc.generate_from_frequencies(text)
#将x轴和y轴坐标隐藏
plt.axis("off")
plt.imshow(wc,interpolation="bilinear")
plt.show()
'''
绘制单个词一个圆形的词云
'''
def single_wordColud():
text = "第一 第二 第三 第四"
#产生一个以(150,150)为圆心,半径为130的圆形mask
x,y = np.ogrid[:300,:300]
mask = (x-150) ** 2 + (y-150) ** 2 > 130 ** 2
mask = 255 * mask.astype(int)
wc = WordCloud(background_color="white",font_path='./simkai.ttf',repeat=True,mask=mask)
wc.generate(text)
#将x轴和y轴坐标隐藏
plt.axis("off")
plt.imshow(wc,interpolation="bilinear")
plt.show()
def grey_color_func(word,font_size,position,orientation,random_state=None,**kwargs):
return "hsl(0,0%%,%d%%)"%random.randint(60,100)
'''
从文件中读取停用词
'''
def get_stopwords():
dir_path = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
#获取停用词的路径
stopwords_path = os.path.join(dir_path,"txt/stopwords.txt")
#创建set集合来保存停用词
stopwords = set()
#读取文件
f = open(stopwords_path,"r",encoding="utf-8")
line_contents = f.readline()
while line_contents:
#去掉回车
line_contents = line_contents.replace("\n","").replace("\t","").replace("\u3000","")
stopwords.add(line_contents)
line_contents = f.readline()
return stopwords
'''
中文分词
'''
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 drow_mask_wordColud():
#获取当前文件的父目录
#d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
#mask = np.array(Image.open(path.join(d,"img/test.jpg")))
#以下用咱们刚刚另存为的图就可以(必须是白色背景)
mask = cv2.imread("img/1.jpg")
#test.txt内容随便写
text = open(path.join("txt/test.txt"),"r",encoding="utf-8").read().replace("\n","").replace("\t","").replace("\u3000","")
#text = "甜心 美丽 漂亮 性感 贤惠 温柔 可爱 宝宝 排长"
print(text)
#对文本进行分词
text = segment_words(text)
#获取停用词
stopwords = get_stopwords()
#创建词云
'''
字体路径 :simkai.ttf 简体字,解决汉字出现框框的问题 这个文件只要你安装了WordCloud第三方库就有的了,如果不知道路径,Everything直接搜索(简单粗暴)
scale:条件生成词云的清晰度,值越大越清晰 默认是1
max_words:显示词的数量
mask:背景
stopwords:停用词,是一个set集合 有的话就自己定义就行了,或者用内置的STOPWORDS stopwords=STOPWORDS 或者直接不设置
margin:词之间的间隔
background_color:词云图片背景颜色
repeat:为词是否可重复 true 为可重复 默认false 不可重复
'''
wc = WordCloud(scale=4,max_words=300,mask=mask,background_color="white",font_path='./simkai.ttf',stopwords=stopwords,margin=10,random_state=1).generate(text)
default_colors = wc.to_array()
# #保存词云图片(自定义)
wc.to_file("img/test.png")
plt.imshow(default_colors,interpolation="bilinear")
plt.axis("off")
plt.show()
if __name__ == "__main__":
drow_mask_wordColud()
#single_wordColud()
#single_wordColud_1()
结果
test.png
自定义一个字体颜色
from wordcloud import WordCloud,get_single_color_func
import matplotlib.pyplot as plt
'''
定义一个字体颜色设置类
'''
class GroupedColorFunc(object):
def __init__(self,color_to_words,default_color):
self.color_func_to_words=[
(get_single_color_func(color),set(words))
for (color,words) in color_to_words.items()
]
self.defalt_color_func=get_single_color_func(default_color)
def get_color_func(self,word):
try:
#设置每个词的颜色
color_func = next(color_func for (color_func,words) in self.color_func_to_words
if word in words)
except StopIteration:
#词的默认颜色
color_func = self.defalt_color_func
return color_func
def __call__(self,word,**kwargs):
return self.get_color_func(word)(word,**kwargs)
if __name__ == "__main__":
text = "第一 第二 第三 第四 第五 第六"
#创建词云
wc = WordCloud(collocations=False,font_path='./simkai.ttf',background_color="white").generate(text)
#设置词的颜色
color_to_words={
#使用RGB来设置词的颜色
"#00ff00":["第一","第五"],
"red":["第三","第六"],
"yellow":["第二"]
}
#设置词默认的颜色
default_color = "blue"
grouped_color_func = GroupedColorFunc(color_to_words,default_color)
#设置词云的颜色
wc.recolor(color_func=grouped_color_func)
#显示词云图
plt.figure()
plt.imshow(wc,interpolation="bilinear")
plt.axis("off")
plt.show()
注:运行过程,缺什么库导什么库
网友评论