词云-高级使用
常用参数
-
width 词云图片宽度,默认400像素
-
height 词云图片高度 默认200像素
-
background_color 词云图片的背景颜色,默认为黑色
background_color='white'
-
font_step 字号增大的步进间隔 默认1号
font_path 指定字体路径 默认None,对于中文可用
font_path='msyh.ttc'
-
mini_font_size 最小字号 默认4号
-
max_font_size 最大字号 根据高度自动调节
-
max_words 最大词数 默认200
-
stop_words 不显示的单词
stop_words={"python","java"}
-
Scale 默认值1。值越大,图像密度越大越清晰
-
prefer_horizontal:默认值0.90,浮点数类型。表示在水平如果不合适,就旋转为垂直方向,水平放置的词数占0.9?
-
relative_scaling:默认值0.5,浮点型。设定按词频倒序排列,上一个词相对下一位词的大小倍数。有如下取值:“0”表示大小标准只参考频率排名,“1”如果词频是2倍,大小也是2倍
-
mask 指定词云形状图片,默认为矩形
通过以下代码读入外部词云形状图片(需要先
pip install imageio
安装imageio)
带形状的词云
通过前一篇的简单词云的制作我们只能得到一张方方正正的词云图片,棱角分明总是不招人喜欢,那我们尝试着做一些特别的词云,心形,棱形,三角形,美少女形…
注意:做有形状的词云颜色一定要是要求白底的(我们可以去ps在线生成网站去抠图)
这里就需要导入其他的包,这里我们导入imageio
库中的imread
函数,并用这个函数读取本地图片,作为词云的形状
这里我们以六月的雨网易云评论为例
from wordcloud import wordcloud
import jieba
import imageio
name = "六月的雨"
f = open(f"{name}.txt", "rt", encoding="utf-8") # 读取文件内容
txt = f.read()
txt_list = jieba.lcut(txt) # 使用jieba库整理文本
for i in txt_list: # 处理掉干扰词汇
if i in ['\n', ',', "。", "!"]:
txt_list.remove(i)
string = ",".join(txt_list) # 构建新的字符串
mk = imageio.imread(f"{name}白底.png") # 制作遮罩层
w = wordcloud.WordCloud(
width=400,
height=200,
scale=5,
font_path="simsun.ttc",
mask=mk, # 遮罩
contour_color="green", # 轮廓线颜色
contour_width=0.5, # 轮廓线尺寸
background_color="white"
)
w.generate(string)
w.to_file(f"{name}词云.png")
原图是这个样子的
那么这样制作出来的词云形状是这个样子的
你以为这样就完了吗? 我们还有更高级的玩法
这次我们导入numpy
,numpy
是python
的一种开源数值计算扩展,这种工具可以用来存储和处理大型矩阵。这里在处理的时候将给出形状的图片表示为一个大型矩阵,再有颜色的地方来进行填词(import numpy as np
).导入后需要添加一个遮罩层,遮罩层就是用来限制生成图片的形状。
这里我们用到
方法 | 属性 | 作用 |
---|---|---|
subplots(nrows=1, ncols=1) | nrows,ncols:int,可选,默认值:1 子图网格的行数/列数。 | 创建一个图和一组子图。该实用程序包装器使您可以在一次调用中方便地创建子图的通用布局,包括封闭的图形对象。 |
savefig(fliename) | fliename保存的文件名 | 保存matplotlib绘制的图像 |
show() | 无 | 展示matplotlib绘制的图像 |
from wordcloud import wordcloud, ImageColorGenerator
from matplotlib import pyplot as plt
import jieba
import imageio
name = "六月的雨"
f = open(f"{name}.txt", "rt", encoding="utf-8")
txt = f.read()
txt_list = jieba.lcut(txt)
for i in txt_list:
if i in ['\n', ',', "。", "!"]:
txt_list.remove(i)
string = ",".join(txt_list)
mk = imageio.imread(f"{name}白底.png")
w = wordcloud.WordCloud(
width=400,
height=200,
scale=5,
font_path="simsun.ttc",
mask=mk,
contour_color="green",
contour_width=0.5,
background_color="white"
)
w.generate(string)
# 调用ImageColorGenerator函数,提取模板图片各部分颜色
image_color = ImageColorGenerator(mk)
# 绘制的图片的规格
plt.figure(figsize=(20, 15), dpi=200) # dpi 分辨率 # figsize 尺寸
# 显示原生词云图、按模板图片颜色的词云图和模板图片,按照左中右显示
fig, axes = plt.subplots(1, 3)
# 最左边的图片显示原生词云图
axes[0].imshow(w)
# 中间的图片显示按照模板图片颜色生成的词云图,采用双线性插值的方法显示颜色
axes[1].imshow(w.recolor(color_func=image_color), interpolation='bilinear')
# 右边的图片显示模板图片
axes[2].imshow(mk, cmap=plt.cm.gray)
for ax in axes:
ax.set_axis_off()
plt.savefig(f"{name}词云plt.png") # 一定要先保存
plt.show() # 再显示,显示完就会直接关闭 保存为空
# 给词云对象按模板图片颜色重新上色
w_color = w.recolor(color_func=image_color)
w.to_file(f"{name}1词云wc.png")
这是plt绘制的图片
这是拾取图片颜色绘制的图片