前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FiveThirtyEight 类型图表 Matplotlib制作

FiveThirtyEight 类型图表 Matplotlib制作

作者头像
DataCharm
发布2021-02-22 14:59:40
1K0
发布2021-02-22 14:59:40
举报

01. 引言

FiveThirtyEight网站,也称作538,是一个专注于民意调查分析,政治,经济与体育的博客。网站于2008年3月7日建立,其名称来源于美国选举人团中选举人的数量,该网站集政治(Politics)、运动(Sports)、科学与健康(Science&Health)、经济(Economics)、文化(Culture)于一身,涉及面非常之广。作为可视化练习教程,我们关注的是其优秀的可视化作品。今天的推文就是对其中一副可视化作品进行仿制。如下所示(https://fivethirtyeight.com/features/fandango-movies-ratings/):

该图为Walt Hickey为了表明Fandango的电影评分系统存在偏见且不诚实而绘制的各大电影评分等级面积图。下面我将详细介绍数据处理过程和Matplotlib对其仿制过程。

02. 数据处理

具体的数据可以在github(https://github.com/fivethirtyeight/data/tree/master/fandango)上直接下载,在这里使用的名为fandango_score_comparison.csv的数据文件,表中各数据所代表的意义可在github上查看。根据Walt Hickey的介绍,我们主要涉及的数据处理过程包括 数据筛选 和 数据归一化 操作。

(1) 数据筛选

结果如下(部分)

技巧:pandas.loc[,]可以根据布尔条件进行数据选择,这里主要介绍可视化过程,数据处理过程会简单介绍,详细内容大家可以查看pandas官网。

(2) 数据归一化

重点:先计算值及其频率,再将频率归一化为百分比,以便比较两个具有不同数据点数量的数据集。

将归一化后的结果(值的频率/值的总数)乘以100,得到百分比,然后对所有索引进行排序,解决折线图混乱显示问题。

这里 value_counts() 可以统计出非Na值的个数,而设置normalize=True属性则返回唯一值的频次(计数占比),再使用sort_index()对数据索引重新排序可有效进行折线图绘制。

03. 数据可视化

Matplotlib 内置了‘fivethirtyeight’风格,通过如下设置可以查看matplotlib内置的所有主题风格

style.available

这里通过style.use('fivethirtyeight')语句即可将matplotlib设置fivethirtyeight绘图风格。

绘制面积图(area)可以直接使用pandas内置绘图方法plot.area()或者plot(type=’area’),但该方法定制行比较差,对于上面的图表将很难进行仿制,这里采用matplotlib的plot()方法绘制折线图,再在折线图下方采用fill_between()方法填充面积,fill_between()方法较为灵活,可以完美解决上述图表的仿制工作。

绘图代码完整如下:

技巧:

① 第22、25、28、31、34、37分别采用了ax.fill_between()方法,和ax.plot()结合进行面积图(area)的定制化绘制。

② 第48行,通过ax.axhline()方法添加一条水平直线,用于绘制x轴的颜色加重直线。

③ 第49-66行,通过ax.text()和 ax.annotate()添加文本标签内容,这里需要注意的是,设置zorder属性分别定义各绘图图层的显示顺序。

④ 第67-75行,通过ax.text()方法设置签名栏,其中设置backgroundcolor属性就可以产出矩形背景效果。第69行s属性通过空格设置实现文本上述图中文本左右对齐,中间分开的效果,如下:

⑤ 第44行ax.set_xticklabels设置x轴标签名,由于暂时无法设置成原图形式,如下:

现阶段只能用‘*‘代替,仿制如下:

有知道解决方法的同学,可以联系告知啊!最后放出自己的仿制的结果啊!

04. 总结

本期推文介绍使用Matplotlib进行FiveThirtyEight网站图表的仿制,目的还是加强自己可视化绘制的技巧和吸收其他优秀可视化作品的设计优点,本推文我认为比较优秀的可视化设计技巧主要有两个:

1、采用plot()+fill_between()完成了Matplotlib绘制面积图定制化的需求;

2、通过设置ax.text()中的backgroundcolor属性以及采用多空格完成签名栏的制作。当然,不足之处也有:1、现阶段无法完成原图x轴标签的星号的仿制;

Matpltlib现阶段还无法如ggplot2 的geom_segement()方法那样灵活绘制线段(连接线)(可能有的,我目前没发现,知道的同学直接联系告知啊,公众号留功能太麻烦啦

)。总之,要想完善自己的可视化技巧,你需要做的就是、多吸收、多模仿、多总结,将优秀的可视化设计理念用到自己的可视化作品中。

>>>>

参考内容

(1)https://fivethirtyeight.com/features/fandango-movies-ratings/

(2) https://pandas.pydata.org/docs/reference/api/pandas.Series.value_counts.html?highlight=value_counts#pandas.Series.value_counts

(3) https://pandas.pydata.org/docs/reference/api/pandas.Series.sort_index.html?highlight=sort_index#pandas.Series.sort_index

(4)https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.fill_between.html?highlight=fill_between#matplotlib.axes.Axes.fill_between

(5) https://python-graph-gallery.com/243-area-chart-with-white-grid/

下期图文预告

下期推文试着用matplotlib进行“艺术”化设计,后期还是会回归 商业图表的制作教程的

。效果如下:

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

本文分享自 DataCharm 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01. 引言
  • 02. 数据处理
  • 03. 数据可视化
  • 04. 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档