Matplotlib 气球图 制作

2021-02-22 14:59:59 浏览数 (1)

01. 引言

Matplotlib 制作稍带“艺术”的可视化作品,ggplot2 基于其优秀绘图图层设置及多种拓展绘图包可以较为灵活的完成此类任务,但Matplotlib也不是完全不可以,本期推文用python经典的绘图包Matplotlib进行“气球”图(通过图形合理搭配实现)的绘制,主要涉及Matplotlib 散点图(sactter())及 线 vlines()、mlines()及PatchCollection()等的灵活应用。上期推文预告的效果图在文末的代码链接(notebook)中 也会有绘制方法,本期推文为完善版本

02. 数据处理

本期推文的绘图数据为描述美国圣诞节播放歌曲的数据,我们选取其中部分年份进行可视化绘制,数据主要如下(部分):

数据介绍:title 为可取名,year为年份(绘图-x),week_position 为星期(绘图-y)。这里提一下,这是处理好的数据结果,原始数据处理过程也不是特别复杂,就不介绍处理过程(这里主要是可视化技巧介绍

)。但有一点需要大家注意:字符串 时间数据 的处理在数据处理和分析中占有很大比例,而pandas也很好继承了Python字符串、时间数据等的灵活处理功能,详细内容,大家可以先看官网教程(看完大多数的数据处理任务都可以满足啦

,后期我们也会根据自己在科研和工作过程中的具体数据处理小技巧进行专门推文教程制作)。

03. 数据可视化

本期推文 数据可视化的难点 在于连接“气球”的连接线的绘制,ggplot2 中geom_segment()可以灵活实现这一过程,而Matplotlib 则相对麻烦点,但也是有绘制连接线的方法的。本期推文的连接线绘制过程大家可直接记住,套用即可

(1) Matplotlib 绘制 线 的方法

大家可能首先想到 ax.axvline()、ax.vlines()和ax.axhline()、ax.hlines() 方法绘制垂直及水平线。ax.axvline()和ax.axhline()用于绘制固定位置的线十分方便,但其范围(长短)位置较为固定,无法随着具体数值进行更改,即transform属性固定。要想根据 具体数值 更改线 长短 ,则还需使用ax.vlines()和ax.hlines()进行绘制。本文刚开始实验过程也是采用ax.vlines()进行尝试下绘制,结果如下:

代码:

结果如下(部分):

结果也可以看出:虽然设置了alpha ,但也会根据 “重复“绘制,导致线的粗细不同,再者,散点(scatter)与 线(vlines) 的连接也不能满足绘图需求。

(2) matplotlib.lines 方法绘制

在尝试多次和查看matplotlib官网后,我们发现matplotlib.lines 可以有效解决连接线问题,这也可以看作为Matplotlib的“geom_segment“。具体如下:

(上图中的代码你也可以当作固定公式进行直接套用即可)

绘制效果:

无论从 连接线的粗细以及点线连接 来看,此方法都可以完美解决。

其中:

代码语言:javascript复制
for p1, p2 in zip(christmas['year'], christmas['week_position']):

christmas['year'] 和christmas['week_position'] 为具体的数据,

newline([p1,1], [p1,p2])则是引用绘线函数。

比如:p1 为 year中数据,我们选1960 ,p2 为 week_position 中数据,选 13,那么在位置 (1960,1)和位置(1960,13) 进行连接线绘制,如下图红线圈出的部分,其他依次绘制即可。

(3) 散点图颜色设置及图例添加

散点图的颜色设置,我们采用字典方法,详细可以查看我之前的推文(推文连接),具体代码如下:

涉及列表表达式和字典的构建,不熟悉的可以自行百度啊,结果如下:

再根据数据christmas 中title 列,遍历即可:

还是那句话,列表和字典的灵活应用,可以使数据处理的效率加倍!!

图例添加还是和之前推文教程一样(Hans Rosling Charts Matplotlib 绘制),如下(部分):

这里结合了刚才构建的color_dict字典。

(4)具体代码及重要部分解释

部分解释如下:

① 第 6 行,在 plt.subplots()中设置了fig背景颜色facecolor和边框颜色edgecolor。

② 第 12- 16 行, 绘制散点图多类别图例。

③ 第 17- 19 行,绘制用于显示光照效果的散点图,设置颜色即可。

④ 第 21 – 28 行,以及 36 – 43 行,都是连接线 的绘制方法。

⑤ 第 30 – 34 行,绘制矩形形状(气球卡口),使用Rectangle() 方法进行绘制。

⑥ 第 47 – 51 行,为具体的图例属性设置,包括图例标题、字体颜色、大小、图例填充颜色以及图例的位置微调等。

⑦ 第 65 行 去除axis 包括网格线、刻度等属性。

⑧ 第 66 行,反转y轴设置。

其他为具体如刻度范围之类的设置。

最终效果如下:

04. 总结

Matplotlib 进行连接线的绘制可以按照上述教程具体绘制,总体而言,Matplotlib没有 ggplot2 那种绘图图层体系,导致绘制复杂的图表变得有些困难,但作为Python 较为完整的绘图包,也是能够找到对应的解决方式的。本期推文的目的还是熟悉绘图技巧,将数据可视化设计当作“艺术“,多看,多练,优秀的可视化绘制技巧终究可以获得的。能力有限,如有出错,请联系我啊(不能留言,直接添加本人微信进行交流吧)。(有小伙伴想要具体的代码及数据,公众号后台回复 气球 两字即可获得notebook源码及数据。回复 代码合集01 ,即可获取之前推文的全部nootbook 及数据。往后的推文除了保密的科研数据之外(当然,会有其他数据代替的),我都会给大家的

,链接失效的话,直接联系我直接发代码给你

)

>>>>

参考内容

(1)https://matplotlib.org/api/_as_gen/matplotlib.patches.Rectangle.html?highlight=rectangle#matplotlib.patches.Rectangle

(2)https://matplotlib.org/api/lines_api.html?highlight=lines#module-matplotlib.lines

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

下期推文预告

下期推文我们用Matplotlib 进行坡度图的绘制,其效果如下:

0 人点赞