绕过 matplotlib 路上那个最大的坑
matplotlib 路上最大的坑!
本人是非计算专业的计算机爱好者,计算机方面的知识和技能都来自于自学。在学习的路上跌落过无数的坑。
三年前开始自学Python语言,很快被它的简洁、明了(近自然语言的语法)征服。Python庞大的第三方库资源又让它几乎无所不能!
我最初学习它的目的是为了做数据分析,因此,必须掌握熟练、高效的数据可视化方法。matplotlib作为Python语言的可视化标准库,当然首先就学它。
matplotlib的对象及其参数设置极其繁杂,导致学习曲线非常陡峭。matploblib为了快速绘图的目的,又提供了三种绘图模式:
- pyplot,函数式绘图接口;
- pylab,仿matlab模式;这个目前已弃用;
- 面向对象绘图。
pyplot提供了一系列绘图函数接口,可以用较少的代码,快速绘制一些常见、简单的图形,所以各种matplotlib教程、书籍无一例外地从pyplot开始,并把函数式绘图作为重点介绍。
基于我的痛苦的自学经历,认为这是为初学者挖了一个更大的坑,具体表现在,迷恋于pyplot函数式绘图的人,都不同程度地遇到如下问题:
- 参照示例绘制能很快绘制出一些简单的图,没有了示例就不知道从哪里下手;
- 示例不可能完全符合要求,就不知道如何添加或修改了;
- 这时就到一些群、贴吧…里留言,求助,这次别人帮助解决了;
- 下次遇到一个相似,但稍有变化的问题时,又不知道怎么解决了
永远处在知其然而不知其所以然的状态,在痛苦中使用matplotlib做数据可视化工作,一部分人最后就绝望了,就在想:有没有更简单好用的Python数据可视化工具呢?
有人就拿python和R比较,认为R的成功很大一部分得益于有一个ggplot2。
我就跌落过这样的坑!
pyplot 歧途
从pyplot函数开始绘图,确实很简单:
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4])
plt.ylabel('some numbers')
plt.show()
确实很简单,4行代码就绘制出了一张线性关系图,并且看起来还可以!
这能很快吸引初学者的眼球,但也给他们挖了一个大大的坑:
- 当想让这张图形更加专业美观时,比如,给坐标轴区域添加一点淡淡的背景色时;
- 想修改轴上的刻度数字格式时,如显示为整数;
- 想修改那根斜线的颜色、粗度时
- …
- 想统一篇论文中的多幅图的格式时。
他们就会就痛苦地去找示例,照着套,当示例代码很长时,因为没有理解matplotlib的逻辑框架,不知道哪行代码是需要的…
这种知其然不知其所以然,永远只能照猫画虎的状态是痛苦的,时间一长继续学习下去的兴趣就消耗殆尽!
在一个交流群中,看到有人问类似这样的问题,如:如何把下图y轴设置为不是科学计数法。
有位热心人帮他改过来了,他又接着问:
我相信一点,这位网友已走上了matplotlib的歧途,如果继续这样学习下去,必然也会跌落那个坑中,最后痛苦地放弃matplotlib。
这个坑就是从**“pyplot函数式绘图”**进入matplotlib。
学习 matplotlib 的挑战
在我看来,新用户学习matplotlib之所以会面临一定的挑战,主要有以下几个原因。
首先,matplotlib有两种接口。第一种是基于MATLAB并使用基于状态的接口,即pyplot绘图。第二种是面向对象的接口。两种接口引起混淆的原因在于,在网络上搜索示例代码时,新用户对那些看起来有些相似但不一样的问题,面对多个解决方案会感到困惑。
其次,matplotlib一开始就追求对图形每个细节的完全自主控制,所以matplotlib中的对象很多,并且经常交叉引用,错综复杂。同一个对象的一些属性经常可以在不同层次设置,让初学者无所适从。
最后,除了官方文档,系统性教材缺乏。可见的一些书籍、教程都从pyplot快速绘图开始,很少深入剖析matplotlib的框架逻辑,新用户长时间处在知期然不知其所以然的状态,无法达到自由操控matplotlib的境界。最后得出一个结论,matplotlib太难了,有些图更本就绘不出来。实际是matplotlib能绘出你相得到的绝大多数图形。
绕过那个最大的坑
要避免落入matplotlib学习路径上那个最大的坑的关键点就是:
- 清晰理解matplotlib的逻辑框架;
- 从面向对象绘图开始。
做到这两点,pyplot函数式绘图会自然习得!
(This End.)