1 简介

词云图是文本挖掘中用来表征词频的数据可视化图像,通过它可以很直观地展现文本数据中地高频词:

图1 词云图示例

在Python中有很多可视化框架可以用来制作词云图,如pyecharts,但这些框架并不是专门用于制作词云图的,因此并不支持更加个性化的制图需求,要想创作出更加美观个性的词云图,需要用到一些专门绘制词云图的第三方模块,本文就将针对其中较为优秀易用的wordcloud以及stylecloud的用法进行介绍和举例说明。

2 利用wordcloud绘制词云图

wordcloud是Python中制作词云图比较经典的一个模块,赋予用户高度的自由度来创作词云图:

图2 wordcloud制作词云图示例

2.1 从一个简单的例子开始

这里我们使用到来自wordcloud官方文档中的constitution.txt来作为可视化的数据素材:

图3 constitution.txt

首先我们读入数据并将数据清洗成空格分隔的长字符串:

import re

with open('constitution.txt') as c:

'''抽取文本中的英文部分并小写化,并将空格作为分隔拼接为长字符串'''

text = ' '.join([word.group().lower() for word in re.finditer('[a-zA-Z]+', c.read())])

'''查看前100个字符'''

text[:500]

图4 清洗后的片段文本

接着使用wordcloud中用于生成词云图的类WordCloud配合matplotlib,在默认参数设置下生成一张简单的词云图:

from wordcloud import WordCloud

import matplotlib.pyplot as plt

%matplotlib inline

'''从文本中生成词云图'''

wordcloud = WordCloud().generate(text)

plt.figure(figsize=[12, 10])

plt.imshow(wordcloud)

plt.axis('off')

plt.show()

生成的词云图:

图5 默认参数下的词云图

毕竟是在默认参数下生成的词云图,既丑陋又模糊,为了绘制好看的词云图,接下来我们来对wordcloud绘制词云图的细节内容进行介绍,并不断地对图5进行升级改造。

2.2 WordCloud

作为wordcloud绘制词云图最核心的类,WordCloud的主要参数及说明如下:

font_path:字符型,用于传入本地特定字体文件的路径(ttf或otf文件)从而影响词云图的字体族

width:int型,用于控制词云图画布宽度,默认为400

height:int型,用于控制词云图画布高度,默认为200

prefer_horizontal:float型,控制所有水平显示的文字相对于竖直显示文字的比例,越小则词云图中竖直显示的文字越多

mask:传入蒙版图像矩阵,使得词云的分布与传入的蒙版图像一致

contour:float型,当mask不为None时,contour参数决定了蒙版图像轮廓线的显示宽度,默认为0即不显示轮廓线

contour_color:设置蒙版轮廓线的颜色,默认为'black'

scale:当画布长宽固定时,按照比例进行放大画布,如scale设置为1.5,则长和宽都是原来画布的1.5倍

min_font_size:int型,控制词云图中最小的词对应的字体大小,默认为4

max_font_size:int型,控制词云图中最大的词对应的字体大小,默认为200

max_words:int型,控制一张画布中最多绘制的词个数,默认为200

stopwords:控制绘图时忽略的停用词,即不绘制停用词中提及的词,默认为None,即调用自带的停用词表(仅限英文,中文需自己提供并传入)

background_color:控制词云图背景色,默认为'black'

mode:当设置为'RGBA'且background_color设置为None时,背景色变为透明,默认为'RGB'

relative_scaling:float型,控制词云图绘制字的字体大小与对应字词频的一致相关性,当设置为1时完全相关,当为0时完全不相关,默认为0.5

color_func:传入自定义调色盘函数,默认为None

colormap:对应matplotlib中的colormap调色盘,默认为viridis,这个参数与参数color_func互斥,当color_func有函数传入时本参数失效

repeat:bool型,控制是否允许一张词云图中出现重复词,默认为False即不允许重复词

random_state:控制随机数水平,传入某个固定的数字之后每一次绘图文字布局将不会改变

了解了上述参数的意义之后,首先我们修改背景色为白色,增大图床的长和宽,加大scale以提升图片的精细程度,并使得水平显示的文字尽可能多:

'''从文本中生成词云图'''

wordcloud = WordCloud(background_color='white', # 背景色为白色

height=400, # 高度设置为400

width=800, # 宽度设置为800

scale=20, # 长宽拉伸程度设置为20

prefer_horizontal=0.9999).generate(text)

plt.figure(figsize=[8, 4])

plt.imshow(wordcloud)

plt.axis('off')

'''保存到本地'''

plt.savefig('图6.jpg', dpi=600, bbox_inches='tight', quality=95)

plt.show()

图6

可以看到相较于图5,在美观程度上有了很大的进步,接下来,我们在图6的基础上添加美国本土地图蒙版:

图7 美国本土地图蒙版

利用PIL模块读取我们的美国本土地图蒙版.png文件并转换为numpy数组,作为WordCloud的mask参数传入:

from PIL import Image

import numpy as np

usa_mask = np.array(Image.open('美国本土地图蒙版.png'))

'''从文本中生成词云图'''

wordcloud = WordCloud(background_color='white', # 背景色为白色

height=4000, # 高度设置为400

width=8000, # 宽度设置为800

scale=20, # 长宽拉伸程度程度设置为20

prefer_horizontal=0.9999,

mask=usa_mask # 添加蒙版

).generate(text)

plt.figure(figsize=[8, 4])

plt.imshow(wordcloud)

plt.axis('off')

'''保存到本地'''

plt.savefig('图8.jpg', dpi=600, bbox_inches='tight', quality=95)

plt.show()

图8

可以看到图8在图6的基础上进一步提升了美观程度,接下来我们利用wordcloud中用于从图片中提取调色方案的类ImageColorGenerator来从下面的星条旗美国地图蒙版中提取色彩方案,进而反馈到词云图上:

图9 美国地图蒙版_星条旗色

from PIL import Image

import numpy as np

from wordcloud import ImageColorGenerator

usa_mask = np.array(Image.open('美国地图蒙版_星条旗色.png'))

image_colors = ImageColorGenerator(usa_mask)

'''从文本中生成词云图'''

wordcloud = WordCloud(background_color='white', # 背景色为白色

height=400, # 高度设置为400

width=800, # 宽度设置为800

scale=20, # 长宽拉伸程度程度设置为20

prefer_horizontal=0.2, # 调整水平显示倾向程度为0.2

mask=usa_mask, # 添加蒙版

max_words=1000, # 设置最大显示字数为1000

relative_scaling=0.3, # 设置字体大小与词频的关联程度为0.3

max_font_size=80 # 缩小最大字体为80

).generate(text)

plt.figure(figsize=[8, 4])

plt.imshow(wordcloud.recolor(color_func=image_colors), alpha=1)

plt.axis('off')

'''保存到本地'''

plt.savefig('图10.jpg', dpi=600, bbox_inches='tight', quality=95)

plt.show()

图10

2.3 中文词云图

相较于英文文本语料,中文语料处理起来要麻烦一些,我们需要先进行分词等预处理才能进行下一步的处理,这里我们使用某外卖平台用户评论数据,先读取进来看看:

import pandas as pd

import jieba

'''读入原始数据'''

raw_comments = pd.read_csv('waimai_10k.csv');raw_comments.head()

图11

接下来我们利用re、jieba以及pandas中的apply对评论列进行快速清洗:

'''导入停用词表'''

with open('stopwords.txt') as s:

stopwords = set([line.replace('\n', '') for line in s])

'''传入apply的预处理函数,完成中文提取、分词以及多余空格剔除'''

def preprocessing(c):

c = [word for word in jieba.cut(' '.join(re.findall('[\u4e00-\u9fa5]+', c))) if word != ' ' and word not in stopwords]

return ' '.join(c)

'''将所有语料按空格拼接为一整段文字'''

comments = ' '.join(raw_comments['review'].apply(preprocessing));comments[:500]

得到的结果如图12:

图12

这时我们就得到所需的文本数据,接下来我们用美团外卖的logo图片作为蒙版绘制词云图:

图13 美团外卖logo蒙版

from PIL import Image

import numpy as np

from wordcloud import ImageColorGenerator

waimai_mask = np.array(Image.open('美团外卖logo蒙版.png'))

image_colors = ImageColorGenerator(waimai_mask)

'''从文本中生成词云图'''

wordcloud = WordCloud(background_color='white', # 背景色为白色

height=400, # 高度设置为400

width=800, # 宽度设置为800

scale=20, # 长宽拉伸程度程度设置为20

prefer_horizontal=0.2, # 调整水平显示倾向程度为0.2

mask=waimai_mask, # 添加蒙版

max_words=1000, # 设置最大显示字数为1000

relative_scaling=0.3, # 设置字体大小与词频的关联程度为0.3

max_font_size=80 # 缩小最大字体为80

).generate(comments)

plt.figure(figsize=[8, 4])

plt.imshow(wordcloud.recolor(color_func=image_colors), alpha=1)

plt.axis('off')

'''保存到本地'''

plt.savefig('图14.jpg', dpi=600, bbox_inches='tight', quality=95)

plt.show()

这时我们会发现词云图上绘制出的全是乱码,这是因为matplotlib默认字体是不包含中文的:

图14 中文乱码问题

这时我们只需要为WordCloud传入font_path参数即可,这里我们选择SimHei字体:

from PIL import Image

import numpy as np

from wordcloud import ImageColorGenerator

waimai_mask = np.array(Image.open('美团外卖logo蒙版.png'))

image_colors = ImageColorGenerator(waimai_mask)

'''从文本中生成词云图'''

wordcloud = WordCloud(font_path='SimHei.ttf', # 定义SimHei字体文件

background_color='white', # 背景色为白色

height=400, # 高度设置为400

width=800, # 宽度设置为800

scale=20, # 长宽拉伸程度程度设置为20

prefer_horizontal=0.2, # 调整水平显示倾向程度为0.2

mask=waimai_mask, # 添加蒙版

max_words=1000, # 设置最大显示字数为1000

relative_scaling=0.3, # 设置字体大小与词频的关联程度为0.3

max_font_size=80 # 缩小最大字体为80

).generate(comments)

plt.figure(figsize=[8, 4])

plt.imshow(wordcloud.recolor(color_func=image_colors), alpha=1)

plt.axis('off')

'''保存到本地'''

plt.savefig('图15.jpg', dpi=600, bbox_inches='tight', quality=95)

plt.show()

图15

3 利用stylecloud绘制词云图

stylecloud是一个较为崭新的模块,它基于wordcloud,添加了一系列的崭新特性譬如渐变颜色等,可以支持更为个性化的词云图创作:

图16 styleword制作词云图示例

3.1 从一个简单的例子开始

这里我们沿用上一章节中使用过的处理好的text来绘制词云图:

import stylecloud

from IPython.display import Image # 用于在jupyter lab中显示本地图片

'''生成词云图'''

stylecloud.gen_stylecloud(text=text,

size=512,

output_name='图17.png')

'''显示本地图片'''

Image(filename='图17.png')

图17

可以看出,styleword生成词云图的方式跟wordcloud不同,它直接就将原始文本转换成本地词云图片文件,下面我们针对其绘制词云图的细节内容进行介绍。

3.2 gen_stylecloud

在stylecloud中绘制词云图只需要gen_stylecloud这一个函数即可,其主要参数及说明如下:

text:字符串,格式同WordCloud中的generate()方法中传入的text

gradient:控制词云图颜色渐变的方向,'horizontal'表示水平方向上渐变,'vertical'表示竖直方向上渐变,默认为'horizontal'

size:控制输出图像文件的分辨率(因为stylecloud默认输出方形图片,所以size传入的单个整数代表长和宽),默认为512

icon_name:这是stylecloud中的特殊参数,通过传递对应icon的名称,你可以使用多达1544个免费图标来作为词云图的蒙版,点击这里查看你可以免费使用的图标蒙版样式,默认为'fas fa-flag'

palette:控制调色方案,stylecloud的调色方案调用了palettable,这是一个非常实用的模块,其内部收集了数量惊人的大量的经典调色方案,默认为'cartocolors.qualitative.Bold_5'

background_color:字符串,控制词云图底色,可传入颜色名称或16进制色彩,默认为'white'

max_font_size:同wordcloud

max_words:同wordcloud

stopwords:bool型,控制是否开启去停用词功能,默认为True,调用自带的英文停用词表

custom_stopwords:传入自定义的停用词List,配合stopwords共同使用

output_name:控制输出词云图文件的文件名,默认为stylecloud.png

font_path:传入自定义字体*.ttf文件的路径

random_state:同wordcloud

对上述参数有所了解之后,下面我们在图17的基础上进行改良,首先我们将图标形状换成炸弹的样子,接着将配色方案修改为scientific.diverging.Broc_3:

'''生成词云图'''

stylecloud.gen_stylecloud(text=text,

size=1024,

output_name='图18.png',

palette='scientific.diverging.Broc_3', # 设置配色方案

icon_name='fas fa-bomb' # 设置图标样式

)

'''显示本地图片'''

Image(filename='图18.png')

图18

3.3 绘制中文词云图

在wordcloud中绘制中文词云图类似wordcloud只需要注意传入支持中文的字体文件即可,下面我们使用一个微博语料数据weibo_senti_100k.csv来举例:

weibo = pd.read_csv('weibo_senti_100k.csv')

weibo_text = [word for word in jieba.cut(' '.join(re.findall('[\u4e00-\u9fa5]+', ' '.join(weibo['review'].tolist())))) if word != ' ' and word not in stopwords]

weibo_text[:10]

图19

'''生成词云图'''

'''生成词云图'''

stylecloud.gen_stylecloud(text=' '.join(weibo_text),

size=1024,

output_name='图20.png',

palette='colorbrewer.sequential.Reds_3', # 设置配色方案为https://jiffyclub.github.io/palettable/colorbrewer/sequential/#reds_3

icon_name='fab fa-weibo', # 设置图标样式

gradient='horizontal', # 设置颜色渐变方向为水平

font_path='SimHei.ttf',

collocations=False

)

'''显示本地图片'''

Image(filename='图20.png')

图20

以上就是本文的全部内容,如有笔误望指出!

python绘制词云图转换图_(数据科学学习手札71)利用Python绘制词云图相关推荐

  1. (数据科学学习手札32)Python中re模块的详细介绍

    一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...

  2. python炫酷动画源代码_(数据科学学习手札85)Python+Kepler.gl轻松制作酷炫路径动画...

    1 简介 Kepler.gl相信很多人都听说过,作为Uber几年前开源的交互式地理信息可视化工具,kepler.gl依托WebGL强大的图形渲染能力,可以在浏览器端以多种形式轻松展示大规模数据集. 图 ...

  3. (数据科学学习手札05)Python与R数据读入存出方式的总结与比较

    在数据分析的过程中,外部数据的导入和数据的导出是非常关键的部分,而Python和R在这方面大同小异,且针对不同的包或模块,对应着不同的函数来完成这部分功能: Python 1.TXT文件 导入: 以某 ...

  4. (数据科学学习手札03)Python与R在随机数生成上的异同

    随机数的使用是很多算法的关键步骤,例如蒙特卡洛法.遗传算法中的轮盘赌法的过程,因此对于任意一种语言,掌握其各类型随机数生成的方法至关重要,Python与R在随机数底层生成上都依靠梅森旋转(twiste ...

  5. (数据科学学习手札61)xpath进阶用法

    一.简介 xpath作为对网页.对xml文件进行定位的工具,速度快,语法简洁明了,在网络爬虫解析内容的过程中起到很大的作用,除了xpath的基础用法之外(可参考我之前写的(数据科学学习手札50)基于P ...

  6. python气象数据可视化学习笔记6——利用python地图库cnmaps绘制地图填色图并白化

    文章目录 1. 效果图 2. cnmaps简介及安装 2.1 写在前面 2.2 cnmaps简介和安装 3. 导入库 4. 定义绘图函数 4.1 使用get_adm_maps返回地图边界 4.2 ax ...

  7. python扩展库用于科学计算的有哪些_数据科学必备的十大 Python 库

    ​Python 已成为当今使用最广泛的编程语言之一,尤其是在数据科学领域. Python 是一种高性能的语言,易于学习和调试,并且具有广泛的库支持.这些库都有自己独特的功能,一些专注于数据挖掘,一些专 ...

  8. python网络数据采集 第三版_(数据科学学习手札31)基于Python的网络数据采集(初级篇)...

    一.简介 在实际的业务中,我们手头的数据往往难以满足需求,这时我们就需要利用互联网上的资源来获取更多的补充数据,但是很多情况下,有价值的数据往往是没有提供源文件的直接下载渠道的(即所谓的API),这时 ...

  9. python 最小二乘回归 高斯核_数据科学中最简单也最重要的算法:线性回归

    全文共1794字,预计学习时长15分钟 线性回归是数据科学中最简单也是最重要的算法.无论面试的工作领域是数据科学.数据分析.机器学习或者是量化研究,都有可能会遇到涉及线性回归的具体问题.要想熟练掌握线 ...

最新文章

  1. php mysql 编程原理_PHP开发的原理及优势介绍
  2. 量子位MEET大会报名开启!各领域头部玩家集结,AI年度榜单揭晓,在这里预见智能科技新未来...
  3. 网站排名在首位后,为什么还要继续做SEO?
  4. 创建容器时[Warning] IPv4 forwarding is disabled. Networking will not work.
  5. go mysql 查询语句_01 MySQL-初识MySQL-查询语句的执行流程-Go语言中文社区
  6. DataGridView控件用法二:常用属性
  7. 一加7 Pro在京东开启预约:人数超34万
  8. 【Webcam设计】x264对OpenCV Mat的编解码
  9. 十四岁如花少女与养父共宿一床
  10. Web前端页面劫持和反劫持
  11. 关于DSP2812控制W5500的程序解读
  12. 一个广告资源运营管理中台系统简介
  13. 一年增加1.2w星,它能否引领中间件的未来?
  14. 鸿蒙os下载到电脑上,华为鸿蒙os系统官网
  15. 华为服务器插键盘的位置,服务器如何调出软键盘
  16. CMD打开Git Bash
  17. DSPE-PEG-NHS;磷脂-聚乙二醇-活性脂,可用于基因转染和疫苗传递(科研试剂)
  18. b2b2c电商平台系统
  19. 全媒体运营师胡耀文教你:如何提升线上活动参与度?分享5个技巧
  20. 世界上应用最广泛的算法之一的卡尔曼滤波算法原理-从放弃到精通-无人机/机器人应用

热门文章

  1. 计算机虚拟卡配置怎么查,如何检查计算机图形卡的配置
  2. 【现代信号处理】 12 - 深入探讨奇异值分解
  3. oracle 采购 日历,Oracle日历
  4. 微信公众号获取用户头像、昵称等信息
  5. 读书随记-当下尽力就好
  6. Android 夜间模式(白/夜间模式的切换)
  7. Java实现模拟电影院购票系统(集合存储数据)
  8. 企业对于Java实习生的招聘要求有哪些?
  9. Oracle OCP 1z0-052 2018年9月最新考过的题库分享-3
  10. 沙师弟学Python多任务之线程