好看吗?
好看就对了,不是你做的。
也不是我做的。。。。
但是吧,跟我走,不后悔。
我这记性不太好,有些话现在不说,写着写着就忘了,还是先说了吧。
就这种东西啊,我这种没专业学过设计的人是设计不出来多好看的,是吧,倒也不是什么审美不好啊,就是纯粹没见过什么好看的词云,谈何想象的空间呢?
就当说我一直以来对词云的认知就停留在了用文字平常一个图案,但是我万万没想到,还能让文字环绕一个图案(见上面那个哪吒)。
所以啊,第一步,也是最重要的一步,叫做:知道自己要设计什么样的词云。
所以现在我们先打开百度,搜一下词云相关的,你喜欢什么关键词就选什么关键词,五分钟后再回来。
技术都是可以学的,眼界不行。
我去兜兜转转了40分钟,好,我回来了,一会儿看我能做几个出来。
基础咱也不多废话,直接上代码和API。
from PIL import Image
# 下面四个要自备
import numpy as np
import matplotlib.pyplot as plt
import jieba
from wordcloud import WordCloud, STOPWORDS
懂得都懂,该下载的都下载好。
我举个栗子再看API吧,不然给绕晕了。
'写了什么不重要,看格式'
wc = WordCloud(
#设置字体,不指定就会出现乱码,这个字体文件需要下载
font_path=r'STKAITI.TTF',
background_color="white",
max_words=2000,
mask=alice_mask,
stopwords=stopwords)
# generate word cloud
wc.generate(text)
以下是WordCloud函数的参数:
font_path : string #字体路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = '黑体.ttf'
# 关于这个字体啊,我要插个嘴进来:去百度一下自己电脑上的字体目录在哪里,因为不同系统的目录是不一样的。
# 找到字体目录之后,复制,复制,复制到当前工程项目下,因为多半在系统盘,Python很可能没有权限去访问,反正我是没有。
# 然后,那个后缀也不一定是ttf,具体情况具体分析,复制过去就知道是什么后缀了,我的就是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不为空时,背景为透明
# 报错:OSError: cannot write mode RGBA as JPEG
# 报错原因:RGBA意思是红色,绿色,蓝色,Alpha的色彩空间,Alpha指透明度。而JPG不支持透明度
# 解决方法:要么丢弃Alpha,要么保存为.png文件
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) #输出到文件
wordcloud.random_color_func(
word=None,
font_size=None,
position=None,
orientation=None,
font_path=None,
random_state=None
)
'''
随机色调颜色生成。
默认着色方法。这只是选择值为80%和亮度为50%的随机色相。
参数:
random_state: 随机种子
其余参数被忽略。
'''
wordcloud.get_single_color_func(color)
# 创建一个颜色函数,该函数返回单个色调和饱和度。不同的值(HSV)。可接受的值是PIL / Pillow可以使用的颜色字符串。
import matplotlib.pyplot as plt
from wordcloud import WordCloud
# 1.读入txt文本数据
text = open(r'test.txt', "r",encoding = 'utf-8').read()
# 文件是网上随便找的,https://zhidao.baidu.com/question/248186919.html
# 2.生成词云图,这里需要注意的是WordCloud默认不支持中文
# 无自定义背景图:需要指定生成词云图的像素大小,默认背景颜色为黑色,统一文字颜色:mode='RGBA'
wc = WordCloud(
# 设置背景色
background_color='white',
# 设置背景宽
width=500,
# 设置背景高
height=350,
# 最大字体
max_font_size=50,
# 最小字体
min_font_size=10,
mode='RGBA',
#colormap='pink' # 太丑了
)
# 产生词云
wc.generate(text)
# 保存图片
wc.to_file(r"wordcloud.png") # 按照设置的像素宽高度保存绘制好的词云图,比下面程序显示更清晰
# 4.显示图片
# 指定所绘图名称
plt.figure("WordCloud_test1")
# 以图片的形式显示词云
plt.imshow(wc)
# 关闭图像坐标系
plt.axis("off")
plt.show()
先来了解一下jieba这个库吧。
精确模式(最常用,只会这个就行):每个字只用一遍,不存在冗余词汇。jieba.cut('XXX')
全模式:把每个字可能形成的词汇都提取出来,存在冗余。jieba.cut('XXX',cut_all=True)
搜索引擎模式:将全模式分词的结果从短到长排列好。jieba.cut_for_search('XXX')
精确模式是最常用的。
文本内容:富强、民主、文明、和谐、自由、平等、公正、法制、爱国、敬业、诚信、友善
代码展示:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import jieba
from wordcloud import WordCloud, STOPWORDS
# Read the whole text.
file = open('test.txt',encoding='utf-8').read()
##进行分词
default_mode =jieba.cut_for_search(file)
text = " ".join(default_mode)
alice_mask = np.array(Image.open("1.png"))
stopwords = set(STOPWORDS)
stopwords.add("said")
wc = WordCloud(
#设置字体,不指定就会出现乱码,这个字体文件需要下载
font_path=r'STKAITI.TTF',
background_color="white",
max_words=2000,
mask=alice_mask,
# contour_width=1, 加这么一行可以绘制轮廓线,不过这个轮廓画的不太准,就不画了。
stopwords=stopwords)
# generate word cloud
wc.generate(text)
# store to file
wc.to_file("qq_result.jpg")
# show
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()
我也不知道这么说,就,看图吧。
像这种的,在一个大图里面有某一组成部分是词云的,怎么弄呢?
我挣扎了一下午,没整出透明图片,那我就把思路放这儿吧,都给我整烦了。
就这样吧,找到了一个网站。。。
太棒了,怎么会有这么好的人呢!!!
import jieba as jb
import wordcloud as wc
from PIL import Image
import numpy as np #1 imread常报错,用numpy和pil替换掉了。
mask=np.array(Image.open('孙悟空.jpg'))
f = open('test.txt','r',encoding='utf-8')
image_colors = wc.ImageColorGenerator(mask) #2 按图片颜色显示字体显色
#写出不要出现的词组
exclude={
'没有','什么','这样','这种','这里','不会','一些','这个','仍然','不是',\
'我们','你们','他们','它们','因为','因而','所以','如果','那么',\
'如此','只是','但是','就是','这是','那是','而是','而且','虽然',\
'自己','知道','可以','看到','那儿','问题','一会儿','一点','现在','两个',\
'这些','有些','然后','已经','于是','一种','一个','一样','时候',\
'三个','说道','可是','地方','怎么','这儿','突然','可能','甚至','还是',\
'那些','还有','只有',\
}
t = f.read()
f.close()
ls = jb.lcut(t)
txt = ' '.join(ls)
w = wc.WordCloud(font_path = 'STXINGKA.TTF',max_words=2000,\
min_font_size=1,max_font_size=30,mask=mask,width = 1000,\
height = 1000,background_color = 'white',stopwords=exclude,\
color_func=image_colors)#3 图片颜色加到参数里
w.generate(txt)
w.to_file('孙悟空.png')
我没有失败,只是暂时,还没成功。
# 11号词云:绘制你的微信好友个性签名词云
# B站专栏:同济子豪兄 2019-05-23
# 导入微信库ichat,中文分词库jieba
import itchat
import jieba
# 先登录微信,跳出登陆二维码
itchat.login()
tList = []
# 获取好友列表
friends = itchat.get_friends(update=True)
# 构建所有好友个性签名组成的大列表tList
for i in friends:
# 获取个性签名
signature = i["Signature"]
if 'emoji' in signature:
pass
else:
tList.append(signature)
text = " ".join(tList)
# 对个性签名进行中文分词
wordlist_jieba = jieba.lcut(text, cut_all=True)
wl_space_split = " ".join(wordlist_jieba)
# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
import imageio
mk = imageio.imread("chinamap.png")
# 导入词云制作库wordcloud
import wordcloud
# 构建并配置词云对象w,注意要加scale参数,提高清晰度
my_wordcloud = wordcloud.WordCloud(background_color='white',
width=1000,
height=700,
font_path='msyh.ttc',
max_words=2000,
mask=mk,
scale=20)
my_wordcloud.generate(wl_space_split)
nickname = friends[0]['NickName']
filename = "output11-{}的微信好友个性签名词云图.png".format(nickname)
my_wordcloud.to_file(filename)
# 显示词云图片
import matplotlib.pyplot as plt
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
print('程序结束')
为什么这么早就出这个啦?
啊,不是没东西了,是后面的东西更实用。
说真的,这个用Python我还真不知道该怎么处理。
我大概懂了一点,要用文字环绕。。。
但是wordcloud好像不支持吧。。。
等着吧,寒假两个月时间我再去挣扎一下。
现在,只能用人家的工具了。工具及教程在此,速来
其实人家工具也挺好的(软骨头)
一年也不贵。
既然是用工具,我就不帮他们做那么多事儿了,教程他们自己提供,我把图给你们吧、
哎,本来要再整点硬菜(情感分析),但是调研之后,发现,此物非我寒假不可得。
这篇词云昨天就允诺给我的粉丝群了,结果拖到了今天,实在抱歉,不能再拖了。
然后呢,我还要对这篇里面的坑说一句:我一定会回来的!!!
好了,我先去复习了,明天下午就烤了。