Python 可视化库非常多,其中 matplotlib 是优缺点明显的一个库,优点是他非常灵活,缺点就是学习起来相对复杂。
最近在整理 matplotlib 入门所需核心知识点,会顺带编写各种练习,其中主要关注如何获得快速自学 matplotlib 的思路。
本文目标图表如下:
matplotlib 有2种风格的 api:
面向对象风格非常适合入门,因此我统一使用这种风格
本文所需要的库如下:
本次使用 vega_datasets 的小麦数据:
类似在一张纸上画出多种图表,其中纸就是放置图表的容器。在 matplotlib 中,这个容器称为 Figure。
因此,代码如下:
"axes 是啥玩意?"
其中 axes 就是坐标系,可以把他看作是一个图表。
subplots 默认参数下,只会生成1个图表,因此现在看起来就是"这张纸(Figure)被1个图表(axes)占满"。
显然,我们需要在 axes 上添加图表各种细节,最重要的当然是数据:
但是,图表看起来有问题:
修改数据源的类型:
现在,柱子像点样子,但是 x 轴上乱七八糟:
虽然此时图表还没有做大最终效果,但是基本形状已经出来。
接下来基本是细节操作。
初学者难以入门 matplotlib 其中一个原因是,他的方法很多,很多时候你甚至不知道如何在网上查找。
接下来就是我要介绍的,如何利用 matplotlib 的帮助,推测出我们需要的方法
首先,我们希望调整 x 轴上刻度标签的显示角度。
在 matplotlib 中对应这些概念:
通常我们的操作都是基于 axes ,因为我们总是在操作某个图表。
看看这个 axes 有什么可以让我们操作的:
看了一下,找到我们的目标:
怎么获取,非常简单:
"但是我们需要设置的是这些刻度标签的角度,拿一堆刻度标签有啥用?"
显然,调整角度是需要设置这些"刻度标签"对象的某个属性,按照之前的方法,查看一下:
果然,找到需要的属性:
万事俱备了:
图表成这样子:
"好像没多大改善呀"
这是因为我们的"图纸"不够宽,空间有限,自然要压缩"图纸"中的内容。
适当调整"图纸"的大小:
现在效果如下:
"我怎么知道这个 subplots 方法中可以设置这个参数?"
这需要查看他的文档,但是,之前我们已经学过查看某个东西可以调整的属性。
我们可以换另一种方式实现一样的效果。
用 plt.setp 方式,找到属性 figwidth ,显然这是"图纸"的宽度,于是可以这么写:
做到这里,你应该会觉得任意使用一个可视化的库,可能1、2行代码即可完成,为啥要折腾这么多?
matplotlib 的灵活在于控制细节。
接下来需要把最小与最大值的柱子标记不同颜色
面向对象设计,意味着图表上你能看到的东西基本上都有一种对象代表他。
现在我们需要找到图表生成的每个柱子。他们在哪里?
原来,本身当我们调用 axes.bar 方法时,这个方法返回的就是这些小柱子:
显然,这是一个集合,我们需要修改其中的某几个柱子的颜色,老规矩查到属性:
现在只需要找到哪个是最小和最大值的柱子就行了:
均值线有特定的方法:
这里涉及一个比较高级的概念——投影与转换,这里不作介绍
图表如下:
接下来就是其他修饰
觉得图表风格有些单调?
看看有哪些内置风格可以选:
选用 ggplot 看看效果:
现在看起来有点辣眼睛:
再设置一下 x、y 轴的名字与整个图表的标题。
用之前的方式,从 axes 中可以轻易找到需要的属性:
但是,字体有些小:
好吧,全局设置字体大小:
接下来我会继续编写更多非常规要求的图表,敬请关注!