前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一次不算愉悦的爬虫与可视化之旅

一次不算愉悦的爬虫与可视化之旅

作者头像
超哥的杂货铺
发布2019-12-18 10:42:19
8500
发布2019-12-18 10:42:19
举报
文章被收录于专栏:超哥的杂货铺

本文用一个实例“还原”爱奇艺指数的两幅图表,带你学习pyecharts可视化。目录安排如下: 两个目标效果与数据来源分析目标1:绘制播放地域分布图 数据获取 数据处理 图形绘制 优化参数 遗留问题目标2:绘制明星看点曲线图 数据获取 数据处理 图形绘制 单个明星看点 全部明星看点 遗留问题总结

以上是截取自pyecharts官方github上的介绍,来源:

https://github.com/pyecharts/pyecharts。相比于基础的Matplotlib绘图库,pyecharts的图形更加好看,支持交互式,使用也非常简便。

本文使用了爱奇艺指数工具,选取了前段时间比较火的电视剧《小欢喜》为参照,使用pyecharts,尝试一步一步还原该剧的看点和播放地域分布的实际效果图,使用的pyecharts版本为0.5x,(注意和最新的1.0不兼容)。在开始之前请安装该版本,并安装相应的中国地图包。

代码语言:javascript
复制
pip install pyecharts==0.5.11
pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg

本次的目标站点为http://index.iqiyi.com,我们首先搜索关键词“小欢喜”,通过浏览器抓包的方式,获取数据,然后把这些数据进行一定的加工,方便pyecharts进行调用,之后通过设置一些参数,达到理想的效果,我会详细说明每个参数对应的实际含义。后台回复“小欢喜”获取全部代码。

两个目标效果与数据来源分析

目标数据是通过json方式存储的,我们只需要使用requests库模拟请求,就可以很容易得到网站的源数据。本次的绘图目标主要是两个:①热度tab下的播放地域分布;② 看点tab下的明星看点分布。见下图。

我们从chrome开发者模式的network选项卡中找到这两个数据,并用下面的代码获取初始数据。

目标1:绘制播放地域分布图

数据获取

输出province的结果如下图

可以看出结构还是非常简单的。我们需要的数据正是data里的name和value。

数据处理

在正式开始引入pyecharts之前,需要说明一个小坑(别问我怎么知道的,简直太折磨人了):这里的省份名不能直接使用,pyecharts能够识别的地名是:北京,上海,内蒙古等形式的,不能带有后面的省,市等字,上面的数据直接绘制是没有效果的(中国台湾是有结果的,因为它没有“省”这个字)。数据处理的代码如下:

图形绘制

我们的目标是一个中国地图的样式,所以需要用到pyecharts的Map图形,下面是Map的文档说明:

这样我们就绘制出了基本的图形,如果用鼠标在地图上移动,已经能够正确显示数值了。但显然这样的图形和我们的目标差距还很大,接下来我们进行一些参数的调整。

优化参数

首先是将地图着色,需要用到参数:is_visualmap=True,效果如下:

虽然颜色是有了,但是只有一种颜色,这是因为默认的颜色数值是从0-100,表示从浅到深的颜色,并且是连续的,而我们这里的“value”值显然是远大于100的。因此我们需要指定颜色的范围。使用visual_range=[21508, 76318672]即可,该列表的值分别为province_values的最大和最小值。修改代码如下:可以看到,颜色的填充已经出来了,不同省份有了不同的颜色。

进一步我们注意到,目标图形中并不是每个省份一个颜色,而是好多省份显示同一种颜色,由高到低显示5种级别的绿色,颜色越深,数值越大。例如,北京是第一级别,颜色最深,江苏上海浙江是第二级别,显示同样的第二级别绿色,以此类推。读者可以在源网站上通过点击左下角的色块进行查看。

那么pyecharts如何将颜色分为不同的等级呢?答案是使用is_piecewise=True设置为分段型(默认为连续),并且使用visual_split_num设置分段个数,如这里需要设置为5。效果如下:

分段的效果是出来了,但是颜色不是我们想要的,我们需要使用

visual_range_color 指定颜色的值。

指定了visual_range_color后,分段效果出来了 ,现在的问题是,它用浅色表示值大的,深色表示值小的,所以我们可以在指定颜色的时候进行一个反转,即:

代码语言:javascript
复制
visual_range_color=['#3DC768', '#57D284', '#7ADDA0', '#A0E7BC', '#C9F1D9'][::-1]#表示将列表倒序

另外,目前的分段值是自动计算出的,我们还可以使用pieces参数指定每一分段的颜色范围。max值是本段的最大值,min为本段的最小值,我这里设定min为低一级段的最大值加1。label可以指定色块右侧的标签,好像去不掉,如果不指定的话就会显示数值。

代码语言:javascript
复制
pieces=[
        {"max": 76318672, "min": 54372809, "label": "高"},
        {"max": 54372808, "min": 46136120, "label": "中高"},
        {"max": 46136119, "min": 30790974, "label": "中"},
        {"max": 30790973, "min": 15530879, "label": "中低"},
        {"max": 15530878, "min": 21508, "label": "低"}
    ]

左下角的图例里low和High的值也可以通过visual_range_text来指定,可以指定为空,也可以指定为“高”和“低”

我们继续把图中每个省的红点去掉一起看效果。参数is_map_symbol_show控制是否显示红点,默认为Ture,我们改为False即可。最终代码和效果如下:

对了,你可能会问我怎么知道这些颜色的16进制值的,我告诉你,我一个一个量的(捂脸…为了此文操碎了心...),用了一个软件叫“屏幕任意取色器”,可以将鼠标经过的点的颜色取下来,告诉你数值。

遗留问题

目标图形里,移动鼠标到相应的省份会显示其省份名字和排名,这个我查了一些资料,但是还不太明白怎么做。好像是应该通过label_formatter回调函数解决,但试了一下没有成功,如果你知道怎么做,欢迎与我交流~

到此,我们基本完成了播放地域的还原(虽然没有100%)。篇幅较长,但代码不多,希望对您有所帮助。

目标2:绘制明星看点曲线图

数据获取

该图形共涉及10位明星在一共49集的看点,我们主要使用pyecharts的Line图形来实现,先实现1位明星的,再进行堆叠。从图中可以看出,如果仅显示黄磊的曲线,发现它不是简单的按照数值的曲线,而是沿着X对称的,这是需要注意的。

数据处理

和目标1一样,首先我们需要准备数据,原始的数据中,10个明星的值是放在一起的,每49个一组,一共490个。

我们把它整理成key-value的形式,其中key是明星的名字,value是一个list,包含他每一集对应的数值。

图形绘制

接下来绘图,我直接给出最终的代码,并附上各个参数的含义,读者可以像上面那样一步一步的进行添加,看看这个过程中的变化。我们用到的Line图的文档说明如下:

单个明星看点

单独列一些几个重要的参数:

代码语言:javascript
复制
is_smooth=True, #曲线平滑显示,默认是False
is_fill=True, #是否用颜色填充,设置为True时,需要指定area_color
area_color=colors[index], #同上文,也是使用软件测量出来的
symbol=None, #去掉曲线上的数据点,否则在拐点处会有一个小圈
area_opacity=0.4, #设置透明度,不设置的话,出不来填充效果
is_datazoom_show=True, #设置横轴组件可缩放
line_opacity=0, #设置曲线的透明度,0为完全透明,表示无轮廓
datazoom_range=[0, 49], #设置缩放的范围
is_splitline_show=False,#去掉默认的网格线,更接近于原图
is_yaxis_show=False, #不显示y轴
xaxis_interval=9,#设置X轴标签的显示间隔,即1,11,21...
xaxis_min=0,#X轴的最小值
xaxis_max=49,#X轴的最大值

我们用上面的代码画出了黄磊的看点曲线图,可以看到与目标图大体上是一致的,但也有一些细节的差距,比如横轴显示的设置,逢10处虚线的设置,拖动条颜色的设置等。这几点我没有找到好的解决方案,读者朋友可以思考尝试一下。

全部明星看点

我们只需要把上面代码的break去掉,并加上颜色的配置(同样是一个一个测量出来的),就可以显示全部的曲线。效果如下面图所示:

需要指出的是,我之前考虑过添加is_stack参数为True,但是发现它会进行累加(可以通过设置显示Y轴来验证),这样出来的数值是不正确的,而如果不设置这个参数,又会在重叠时显示多种颜色,暂时还没想到好的解决方案。

你可能发现最终的图形形状轮廓和目标图形不一样,这个我也不知道是什么原因,但检查数据过后是没问题的。不过原网站似乎是存在bug的,例如,黄磊在37集和49集的数值分别为1628和1322,但是在原网站的图形中,却是49集的图形更高一些(不过单独显示黄磊的时候,没有问题,形状也和我的代码结果一致,其他明星也是正确的)。也许还存在其他我没有发现的点,这可能也是造成差异的原因吧。如果你有更好的想法,欢迎与我交流。

遗留问题

拖动轴的颜色和标签设置,逢整十的数值虚线绘制,如何在颜色重叠时显示一种颜色(颜色堆叠)

总结

至此我们尝试还原了爱奇艺指数上小欢喜这部剧的播放区域图和明星看点图,虽然没有做到100%的还原,也有很多问题没有解决,所以我觉得“不算愉悦”。但在这个过程中学习了pyecharts的使用,理解了其参数的含义。可以看到pyecharts虽然已经十分强大了希望对看到这里的你有所启发!后台回复“小欢喜”可获取全部代码。爱奇艺指数的另外一些图,可以后续进一步学习绘制。至于文中提到的遗留问题,我后续会尝试查阅资料解决,如果你有更好的方案,欢迎一起交流!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 超哥的杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 两个目标效果与数据来源分析
  • 目标1:绘制播放地域分布图
    • 数据获取
      • 数据处理
        • 图形绘制
          • 优化参数
            • 遗留问题
            • 目标2:绘制明星看点曲线图
              • 数据获取
                • 数据处理
                  • 图形绘制
                    • 单个明星看点
                      • 全部明星看点
                        • 遗留问题
                        • 总结
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档