查看原文
其他

数据可视化 | 讲究!用 Python 制作词云图学问多着呢

快点关注→ 数据Seminar 2022-12-31

目录

前言

Python 词云生成工具

  1. pyecharts  ——  简单易用但不够美观

  2. wordcloud —— 使用最多的的词云库

  3. stylecloud —— 最接近完美的 Python 词云库

    (1)词云形状

    (2)配色方案

    (3)字体

总结

Part1前言

文本可视化是一个话题极少的数据可视化研究方向,但只要讲到它,大家第一时间想到的应该就是“词云图”了吧。“词云”就是通过形成“关键词云层”或“关键词渲染”,对文本中出现频率较高的关键词进行视觉上的突出。词云图过滤掉大量的文本信息,使浏览者只要一眼扫过词云图就可以领略文本的主旨。

上期文章我们为大家介绍了如何使用 Python 做文本词频分析,着重讲解了文本预处理和中文分词部分。那么本期文章我们就紧跟着上期文章的脚步,为大家介绍如何使用 Python 制作精美绝伦的词云图。

我们选用上期文章中使用到的 《“十四五”规划》作为词频统计和制作词云图的对象,出现频率较高的部分词语如下图所示:

公众号对话框内发送关键词“20220902”,即可获得本文词云所有资源!

Part2Python 词云生成工具

📌小贴士:

  1. 本文重点在第三部分:stylecloud
  2. 本文中代码的注释同样值得一看
  3. 词云图的词语分布(颜色,位置,方向)是随机的,即每次运行都可以得到一个全新的词云图,所以当不满意某个词云图时,不妨多运行几遍代码,一定会得到一个满意的。

1pyecharts  ——  简单易用但不够美观

使用 pyecharts 生成词云图是一件非常简单的事情,只需要简单的几行代码即可。首先,pyecharts 需要的语料格式如下(也可以使用词语权重来替代词频):

[(词语1,词频1), (词语2,词频2)……]

根据词频统计 Excel 表(词频统计表如何制作可以参考上期文章)生成以上格式的代码如下:

# 所有词语词频统计结果
data1 = pd.read_excel('十四五规划词频统计表.xlsx')
df = data1.head(50)      # 取前五十行,代表前 50 个词语
Words = [(w, f) for w,f in zip(df['词语'], df['词频'])]
# [('发展', 411),('建设', 349),('完善', 276),('体系', 252),……]

那么使用 pyecharts 生成词云图的代码如下,

wordcloud=WordCloud()
# 词云图轮廓(shape),可选参数有’circle’, ‘cardioid’, ‘diamond’, ‘triangleforward’, ‘triangle’, ‘pentagon’, ‘star’ 
wordcloud.add("", Words, shape='circle')
# 生成 html 文件
wordcloud.render("./词云图/pyecharts词云图.html")

打开生成的 html 文件即可看到生成的词云图,如下图所示:

我们相信,这种效果的词云图应该,可能,大概,或许不能入各位法眼……

2wordcloud —— 使用最多的的词云库

wordcloud 是使用Python 制作词云图使用最广泛的工具,但是使用它制作词云图并不是一件简单的事情:首先,在安装它的时候,就很有可能遇到麻烦,因为 wordcloud 库需要依赖 Microsoft Visual C++ 环境,需要事先安装该组件;其次,为了词云图的美观,使用过程中需要配合其他第三方库使用,比如 PIL(用于加载背景图)。

wordcloud 可以接收多种格式的语料,可以是空格分隔的词语串,也可以是词语,词频组成的字典。下面我们使用词频统计 Excel 表构建字典语料,代码如下:

#上面已经读取了数据,这里不再重复读取
Words_dict = df.set_index('词语').to_dict()['词频']
# {'发展': 411,'建设': 349,'完善': 276,'体系': 252,……}

词云背景(形状)图使用下图(椭圆.png):

使用 wordcloud 生成词云图的代码如下:

from PIL import Image   #图片处理
import matplotlib.pyplot as plt
from wordcloud import WordCloud

img = Image.open('椭圆.png'# 加载背景图片
img_array = np.array(img)    # 将图片变为数组,便于用作词云图形状

wordcloud = WordCloud(
    mask = img_array,     # 设置背景图,上面已经加载
    font_path="C:/Windows/Fonts/SimHei.ttf"#设置字体和大小,这里使用黑体
    max_font_size = 70,   # 词云图中词语字号最大值
    min_font_size = 7,    # 词云图中词语字号最小值
    max_words=100,        # 设置词语数量
    repeat=True,          # 当 max_words 超过总词数,是否使用重复的词语代替
    background_color="white"# 设置背景颜色为白色
    width=200,            # 设置宽高
    height=100
    ).generate_from_frequencies(Words_dict)

# 将词云图保存到本地
wordcloud.to_file('wordcloud词云图.png')  

以上就是使用 wordcloud 生成的词云图了,实际效果也是比较不错的,它的优点是可以控制的参数很多,可以尽情 DIY(包括背景图,主题颜色,词语大小等等),缺点是代码较复杂,依赖的环境/工具较多。

3stylecloud —— 最接近完美的 Python 词云库

也是本文最想介绍的词云工具 !stylecloud是一款简单易用的 Python 词云生成第三方库,使用非常简单,但是得到的词云图却高级感十足。

📌小贴士:

事实上,stylecloud 是 wordcloud 的高级封装版本。这意味着 stylecloud 库需要依赖 wordcloud 库。这也是我们认为它接近完美而非真正完美的原因。

首先,我们认为影响词云图效果的因素有两大类,即语料和词云图形,其中语料的质量可以通过分词来控制;那么如何提高词云图形的质量呢?我们认为最影响词云图形的因素有以下 3 个:

  1. 词云形状
  2. 配色方案
  3. 字体

下面我们就从这三个方面入手,一步一步美化词云图。先使用 stylecloud 制作一个默认的词云,但在此之前需要构建语料 。stylecloud 需要的语料可以是词语列表、词语词频 csv 文件或词语词频 txt 文件,我们使用词频统计表的前 200 个词语来构建不同格式的语料,构建语料的代码如下(不熟练的小伙伴也可以手动填写词语和词频来生成语料):

# 取词频统计表的前 200 个词语
df = data1.head(200)

# 构建词语列表语料
All_words = []
[All_words.extend([w]*f) for w,f in zip(df['词语'], df['词频'])]

# 生成 csv 语料,将词频统计表另存为 csv 数据即可
df.to_csv('词频最高的200词.csv', index=False, encoding='utf-8')

# 生成 txt 语料
f = open('词频最高的200词.txt''a', encoding='utf-8')
for word,frequancy in zip(df['词语'], df['词频']):
    f.writelines(word + ' ' + str(frequancy) + '\n')
f.close()

生成的语料展示如下(使用记事本打开后):

使用 stylecloud 库(使用默认参数)生成词云图的代码和词云图如下:

# 导入 stylecloud 库 
from stylecloud import gen_stylecloud

# 使用上面得到的 csv 语料生成词云图
# 除必要参数外尽量不使用其他参数
gen_stylecloud(
    file_path='词频最高的200词.csv',   # 必要参数,语料的路径,如果语料是列表格式,则改用 text 参数
    size=(600,600),         # 词云图的长宽,设置更大的数字可以增加成图的分辨率,但代码运行时间会随之增加
    max_words=200,          # 词云图中的最大词语数量
    max_font_size=120,      # 词云图中字号的最大值
    font_path=r'C:\Windows\Fonts\SimHei.ttf'# 字体是必要的参数,否则中文会显示异常
    output_name='StyleClond词云图.png',       # 必要参数,保存词云图的路径
)

一面旗!使用默认参数生成的词云图还是非常不错的,另外,从词语数量的增多可以看出,使用更多的词语可以使词云图更加饱满,视觉效果更佳。

下面我们将逐步修改词云形状,配色方案和字体来 DIY 一个更令人满意的词云图。

(1)词云形状

stylecloud 词云形状使用特定网站(https://fa5.dashgame.com/#/)中的图标,进入该网站,滚动鼠标下拉找到【查看图标】,点击进入后即可在 1600+ 图形中选择中意的形状,选择图形后,点击图形右上角即可复制图形的名称,如下图所示:

我们再将复制到的内容赋给参数 icon_name 即可生成这个形状的词云,代码如下:

gen_stylecloud(
    file_path='词频最高的200词.csv',   # 必要参数,语料的路径,如果语料是列表格式,则改用 text 参数
    size=(600,600),         # 词云图的长宽,设置更大的数字可以增加成图的分辨率,但代码运行时间会随之增加
    max_words=200,        # 词云图中的最大词语数量
    max_font_size=120,      # 词云图中字号的最大值, 默认值是 200
    font_path=r'C:\Windows\Fonts\SimHei.ttf',  # 字体是必要的参数,否则中文会显示异常
    output_name='./美化/StyleClond词云图.png',      # 保存词云图的路径
    icon_name='fas fa-cloud'    # 设置词云形状为云朵,设置此参数后,系统会到自动到网页端获取对应的背景图

另外,再添加参数 invert_mask=True 还可以将形状反转,(代码省略)直接展示结果:

(2)配色方案

配色方案将直接影响词云图的观感,在展示某些主题下的文本词云时,可以选择合适的配色。比如当我们制作与海洋产业有关系的文本词云时,可以设置主题颜色为蓝色/绿色/青色系列颜色。stylecloud 中词云的配色可以由 Python 配色工具库 palettable 来提供,其默认的配色方案也是由palettable 所提供的。我们找到了民间大神整理的配色方案PDF文档,文档中部分配色方案如下图所示:

如果想要使用图中的配色方案,只需在生成词云的代码前面声明(使用上图中左侧的代码)即可,例如,我们使用上图中 Blues_7 蓝色配色方案,声明配色方案的代码如下:

# 导入配色方案库
import palettable
palettable.colorbrewer.sequential.Blues_7
# 下面在添加生成词云的代码即可

此外,假如配色方案中没有我们喜欢的配色方案,那么我们还可以自定义配色方案,将选择的颜色填入一个列表,再将颜色列表赋给参数 colors 即可。那么如何选择颜色呢?我们为大家推荐一个可以 DIY 的无广告调色网页(http://www.ku51.net/rgbhex.html)。该网页支持用户自己调色(通过控制 R.G.B 颜色权重)来生成对应颜色的十六进制代码,如下图所示:

也可以在已有的几百种颜色中进行选择,如下图所示:

选中颜色后只需将对应的颜色代码填入 colors 参数列表中即可。我们选择几种较浅的暖色系颜色组成一个配色方案,代码如下:

gen_stylecloud(
    file_path='词频最高的200词.csv',   # 必要参数,语料的路径,如果语料是列表格式,则改用 text 参数
    size=(600,600),         # 词云图的长宽,设置更大的数字可以增加成图的分辨率,但代码运行时间会随之增加
    max_words=200,        # 词云图中的最大词语数量
    max_font_size=120,      # 词云图中字号的最大值, 默认值是 200
    font_path=r'C:\Windows\Fonts\SimHei.ttf',  # 字体是必要的参数,否则中文会显示异常
    output_name='StyleClond词云图_NS.png',      # 保存词云图的路径
    icon_name='fas fa-cloud',  # 词云形状
    # 自定义颜色列表
    colors=['#FFDAB9''#FFE4E1''#FFC1C1''#CDCDB4''#EECBAD']
)

除了颜色的变化,我们还可使用参数 gradient 来控制词云图色温变化的梯度,当不使用这个参数时,每个词语的颜色是可用颜色中随机的一种。也就是上面词云图中混乱无序的样子。当我们将gradient 参数设置为任意非空字符串,就可以使词云图中的颜色分布按照色温,色深沿着特定方向变化,效果非常 Nice。代码如下(注意参数 size变为整数,否则会报错):

gen_stylecloud(
    file_path='词频最高的200词.csv',   # 必要参数,语料的路径,如果语料是列表格式,则改用 text 参数
    size=600,         # 词云图的长宽,设置更大的数字可以增加成图的分辨率,但代码运行时间会随之增加
    max_words=200,        # 词云图中的最大词语数量
    max_font_size=200,      # 词云图中字号的最大值, 默认值是 200
    font_path=r'C:\Windows\Fonts\SimHei.ttf',  # 字体是必要的参数,否则中文会显示异常
    output_name='./美化/StyleClond词云图_SW.png',      # 保存词云图的路径
    icon_name='fas fa-cloud',    # 词云形状
    palette='cartocolors.qualitative.Bold_5',  # 配色方案,由于前面声明了其他的配色方案(Blues_7),
                                               # 我们这里重新指定配色为 Bold_5,这也是默认的配色)
    gradient='颜色渐变666',   # 是否渐变色,可以是任意非空字符,为空字符时该参数不生效
    )

(3)字体

使用不同字体同样可以优化词云图的观感,对 Windows 用户来说,选择字体并不难,系统字体默认的存储路径为:C:\Windows\Fonts\,找到这个文件夹就可以查看系统中的字体,双击字体图标可以预览字体,不过很多字体并没有对中文做优化,因此设置后可能存在无法显示的情况。预览字体的截图如下:

鼠标右击图标后选择【属性(R)】可以查看该字体文件的名称,如下图所示:

我们使用 【微软雅黑】 字体(字体名为 msyhbd.ttc,使用 font_path参数设置字体路径)重新生成一个词云(由于字体加粗,我们将最大词数由 200 减少到 150)。最大字号下调至 150,图片尺寸由 600 调整为 1000,这个操作可以提高词云图的分辨率,防止小词语模糊不清。代码如下:

gen_stylecloud(
    file_path='词频最高的200词.csv',
    size=1000,
    max_words = 150, 
    max_font_size = 150,
    font_path=r'C:\Windows\Fonts\msyhbd.ttc',  # 使用此参数指定字体
    output_name='./美化/StyleClond词云图_ZT.png',
    icon_name = 'fas fa-cloud',
    palette = 'cartocolors.qualitative.Bold_5',
    )

公众号对话框内发送关键词“20220902”,即可获得本文词云所有资源!

Part3总结

本期文章我们为大家详细介绍了如何使用 Python 制作词云图,在制图过程中,我们可以通过设置不同的参数来改变词云的形状、配色、字体、词数等词云图要素。学习这些之后,我们就可以自己动手,制作想要的词云图了。希望本文内容对大家有所帮助。





星标⭐我们不迷路!
想要文章及时到,文末“在看”少不了!

点击搜索你感兴趣的内容吧


往期推荐


基本无害 | 使回归有意义 —— 附录:平均倒数加权函数的推导

基本无害 | 使回归有意义——回归的细节(全)

大数据分析 | 用 Python 做文本词频分析

企业数据库匹配系列(三)|专利库与工企库匹配报告(下)

数据治理|专利库与工企库匹配报告(上)





数据Seminar




这里是大数据、分析技术与学术研究的三叉路口


文 | 两米哥


    欢迎扫描👇二维码添加关注    

点击下方“阅读全文”了解更多

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存