查看原文
其他

pyecharts绘图——河流图展示

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王子一,中南财经政法大学金融学院

本文编辑:寇晓璇

技术总编:张馨月

爬虫俱乐部云端课程

  爬虫俱乐部于2020年暑期在线上举办的Stata与Python编程技术训练营和Stata数据分析法律与制度专题训练营已经圆满结束啦~应广大学员需求,我们的课程现已在腾讯课堂全面上线,且继续提供答疑服务。现在关注公众号并在朋友圈转发推文《来腾讯课堂学Stata和Python啦》或《8月Stata数据分析法律与制度专场来啦!》,即可获得600元课程优惠券,集赞50个再领200元课程优惠券!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元

之前我们在《【爬虫实站】“双十一”微博热搜实时跟进》这篇推文中运用了河流图为大家展示热度占比,着实吸引人的眼球,今天我们为大家推送河流图的介绍,大家康过之后一定会say:“so easy!”。

河流图(Streamgraph),也称为主题河流图(ThemeRiver),是堆积面积图的一种变形,通过“流动”的形状来展示不同类别的数据随时间的变化情况。但不同于堆积面积图,河流图并不是将数据描绘在一个固定的、笔直的轴上(堆积图的基准线就是x轴),而是将数据分散到一个变化的中心基准线上(该基准线不一定是笔直的),如下图所示。

       那么,如此高大上的图像该如何绘制呢?下面我们来一起了解一下吧~

基本语法

pyecharts绘制过程可以划为图表函数全局配置add数据系列配置这几模块,最后再导出展示图表就可以了。首先要调用图表函数,其余三项顺序不限。

1.图表函数

图表函数很简单,你想要画什么图表,就调用相应的图表函数。比如这里我们调用河流图:1from pyecharts.charts import ThemeRiver
2.InitOpts()

opts.InitOpts()用于设置初始化配置项,如图表画布宽度、高度、图表背景颜色、图表主题等,这里列举了部分用法:

代码含义
width = "900px"图表画布宽度
height = "500px"图表画布高度
page_title = "pyecharts"网页标题
theme = "white"图表主题
事实上,该选项隶属于全局配置项set_global_opts当中,该选项含超多内容,比如说,工具箱设置参数ToolboxOpts,提示框配置项TooltipOpts,单轴配置项SingleAxisOpts,标题配置项TitleOpts等。建议函数定义+官网参数详解联合使用,效果翻倍。

这里向你抛出官网全局变量详解:

https://pyecharts.org/#/zh-cn/global_options

3.add()

在add()中,我们可以加入横轴纵轴数据集,设置图表的坐标轴、标题等,部分用法如下:
代码含义
series_name=x_data加入x轴数据
data=y_data加入y轴数据集
is_selected: bool = True是否选中图例
label_opts: Union[opts.LabelOpts, dict] = opts.LabelOpts()标签配置项
tooltip_opts: Union[opts.TooltipOpts, dict, None] = None提示框组件配置项
singleaxis_opts: Union[opts.SingleAxisOpts, dict] = opts.SingleAxisOpts()单轴组件配置项

注:每个参数后面都会标注出所对应的数据类型,标注的方式为:数据类型,如:bool,表示该参数需要用布尔型表示。

4.set_series_opts()

系列配置项set_series_opts,这个系列配置参数主要包含一些图表内部比较细致的配置,线条颜色、文字样式等等。下面举例常用配置参数:
配置参数含义
ItemStyleOpts图元样式配置项,可配置图形的颜色,纹理,渐变
TextStyleOpts文字样式配置项,可匹配文字颜色,字体,字号,粗细等
LabelOpts标签配置项,可配置是否展示标签,及标签相关配置信息
LineStyleOpts线样式配置项,可配置线样式的相关参数

注:不同的图表有不同的配置需求,不必将所有配置项都加入进同一图表中。

5.render()

render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件;也可以传入路径参数,如themeriver.render("theme_river.html")。pyecharts画图核心部分就是以上这几部分,只需要你按部就班,找到需要设置的函数所处位置,设置你需要的参数类型,一点点堆叠,就可以得到一幅精美的图表。

简单应用

在了解了基本的选项之后,我们就可以轻松地看懂官方的示例代码了~我们先设置x与y轴的数据集,其中x轴为6大类别,y轴为各类别在不同日期对应的取值: 1x_data = ["DQ""TY""SS""QG""SY""DD"]
2y_data = [
3    ["2015/11/08"10"DQ"],
4    ["2015/11/09"15"DQ"],
5 ...
6    ["2015/11/27"22"DQ"],
7    ["2015/11/28"10"DQ"],
8    ["2015/11/08"35"TY"],
9    ["2015/11/09"36"TY"],
10 ...
11    ["2015/11/27"42"TY"],
12    ["2015/11/28"42"TY"],
13    ["2015/11/08"21"SS"],
14    ["2015/11/09"25"SS"],
15 ...
16    ["2015/11/27"47"SS"],
17    ["2015/11/28"41"SS"],
18    ["2015/11/08"10"QG"],
19    ["2015/11/09"15"QG"],
20 ...
21    ["2015/11/27"22"QG"],
22    ["2015/11/28"10"QG"],
23    ["2015/11/08"10"SY"],
24    ["2015/11/09"15"SY"],
25 ...
26    ["2015/11/27"22"SY"],
27    ["2015/11/28"10"SY"],
28    ["2015/11/08"10"DD"],
29    ["2015/11/09"15"DD"],
30 ...
31    ["2015/11/27"22"DD"],
32    ["2015/11/28"10"DD"],
33]

接下来,对我们在语法介绍部分的基本选项进行设置即可:

1(
2    ThemeRiver(init_opts=opts.InitOpts(width="1600px", height="800px"))
3    .add(
4        series_name=x_data,
5        data=y_data,
6        singleaxis_opts=opts.SingleAxisOpts(
7            pos_top="50", pos_bottom="50", type_="time"
8        ),
9    )
10    .set_global_opts(
11        tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line")
12    )
13    .render("theme_river.html")
14)

果如图:

注:这里需要注意y_data数据格式:[“刻度”,“数值”,“对象”],所以构造数据的时候也要保持这样的格式。

上述代码属于链式,格式为1themeriver = (
2    ThemeRiver()
3    .add()
4    .set_global_opts()
5    .render()
6)

若不习惯链式调用的开发者依旧可以使用单独调用方法,格式为

1themeriver = ThemeRiver()
2themeriver.add()
3themeriver.set_global_opts()
4themeriver.render()

具体实例

我们在以往的推文中也展示过很多的词频统计,但之前一直选用词云图向大家展示其关键词热度,其实河流图也有异曲同工之处。下例展示了某公司年报关键词的河流图程序: 1from pyecharts.charts import ThemeRiver
2import pyecharts.options as opts
3import openpyxl
4import jieba
5import re
6import pandas as pd
7
8#定义函数,将文章平分成n个段落,统计每个段落词频数
9def frequency(word_1,words,n):
10    list = []
11    step = int(len(words)/n)
12    for i in range(n):
13        total = 0
14        list_1=[i]
15        list_2 = words[i*step:(i+1)*step]
16        for word_2 in list_2:
17            if word_2==word_1 :
18                total+=1
19        list_1.append(total)
20        list_1.append(word_1)
21        list.append(list_1)  ##构造河流图y轴数据格式
22    return list
23
24#读入文本
25txt=open("D:\\2012_年报.txt",'r').read()
26words=jieba.lcut(txt)
27
28#统计词频
29count={}
30sum = len(words)
31for word in words:
32    if len(word)==1:
33        continue
34    else:
35        count[word]=count.get(word,0)+1
36items=list(count.items())
37items.sort(key=lambda x:x[-1],reverse=True)
38
39#导入河流图数据
40x_data=[]
41y_data=[]
42for word in range(10):
43    x_data.append(items[word][0])
44for i in x_data:
45    y = frequency(i, words,20)   
46    for j in y:
47        y_data.append(j)
48
49#绘制河流图
50river=ThemeRiver(init_opts=opts.InitOpts(width="1200px", height="600px"))
51river.add(
52    series_name=x_data,
53    data=y_data,
54    label_opts=opts.LabelOpts(font_size = 18),
55    singleaxis_opts=opts.SingleAxisOpts(pos_top="50", pos_bottom="50")
56)
57river.set_global_opts(
58    tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line")
59)
60river.render("年报词频河流图.html")


       当然还有许多的案例可以应用河流图展示,也欢迎大家和我们多多交流噢~





对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!往期推文推荐

你知道MDPI期刊的热门题目吗?

文件合并你不行,mergemany来帮宁

         分组进行描述性统计的小技巧 --astx命令介绍

新年快乐|爬虫俱乐部2020年度总结

不能忘却的记忆| B站弹幕爬虫

Python中实现Excel的重复值提取fileexists:告诉你“我”存在吗?

工作中一切困难的解决途径——motivatedolly

【爬虫实战】喜茶的门店都开在了哪里?

import delimited | 再也不用担心读入网页源代码“乱七芭蕉”了

如何简洁地列出指定属性的变量?ds命令来了!

如何在Python中进行描述性统计分析?

分析师和他们的雇主重视与管理层接触吗?——分析师参与盈余电话会议的研究

繁忙的董事与公司业绩:来自并购的证据使用Python接口读取CSMAR数据列表生成式|让你的代码简洁又美观Stata中变量观测值的亲密伙伴——levelsof命令

爬虫俱乐部开发的命令更新及常见问题说明

Seminar | 道德培训真的有用吗?

网络爬虫入门之requests 库的基本使用——以亚马逊图书界面为例关于我们


微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

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

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