数据可视化,我们为什么要放弃Matlab转投Python阵营

最近有一位好友问到我,“为什么大家最先接触到的科学计算和数据可视化工具都是MATLAB?”

其实在讨论这个问题的时候,我们首先应该考虑到的是时间的局限性。

对于老一辈的人,最先使用的科学计算语言是FORTRAN。FORTRAN诞生于1951年,是世界上最早出现的计算机高级程序设计语言,所以在那个年代FORTRAN是最好的选择。后来,这批最先使用FORTRAN的人,在科研以及教学领域逐渐成为了领头羊,他们在工作中创作出了无数久经考验的优质代码,所以他们所带领的团队、所教授的学生中最先接触的必是FORTRAN。

随着时间的推移,在老一辈科学家带领下成长起来的人成为了行业里新的领头羊,这一代人在成长的过程中所能接触到的科学计算工具已经不止FORTRAN,还有诞生于1984年MATLAB,MATLAB相比于FORTRAN,已经不光可以做科学计算了,它以矩阵运算为基础,把计算、可视化、程序设计融合到一个交互工作环境中,可以实现工程计算、算法研究、建模和仿真、数据统计分析、工程绘图、应用程序开发等功能。慢慢的MATLAB成为了团队里主流的工具,大学里教授的课程也以MATLAB为主了。而这一代人正是我们年轻人大学里的导师、教授,项目中的领导。

所以针对“为什么大家最先接触到的科学计算和数据可视化工具都是MATLAB”这个问题,可以总结出以下两点原因:

  1. MATLAB资格老,早批使用者大部分成为了当前教学以及行业中的领头羊,导致学校教学过程中以MATLAB教学为主

  2. 相比于FORTRAN等更老的语言,不仅可以进行科学、工程计算,还可进行数据可视化展示。


从FORTRAN诞生到MATLAB诞生经历了33年的时间,从1984年MATLAB诞生到2017年又是一个33年,在这期间就没有别的语言可以替代MATLAB了吗?MATLAB就是我们年轻人的选择了吗?我们没有更好的选择了吗?

答案是否定的!我们不仅有MATLAB,我们还有Matplotlib!

Matplotlib是由John D. Hunter (1968 – 2012)编写的一款强大的Python数据可视化绘图库。 虽然它源于模仿MATLAB,但是它却不同于MATLAB,与MATLAB相比它的优势在于:

  1. 免费。MATLAB是一款商业软件,价格不菲;而Matplotlib是开源免费的。

  2. Matplotlib是Python的拓展库,所以继承了Python语法的优点,面向对象、易读、易维护、代码简洁优美。

  3. Matplotlib依托于Python,可借助Python的强大丰富的拓展模块嵌入在图形用户界面应用程序中,也可嵌入在网页中。

曾经John D. Hunter也是MATLAB的重度使用者,他使用MATLAB做数据分析和可视化多年。但是当他开始处理EEG(脑电图)数据时,他需要写一个与数据进行交互的应用程序,所以他用MATLAB开发了一个脑电图分析的应用。 随着需求的增加,这个应用程序的复杂性越来越高,数据库交互问题、http服务器问题、复杂的数据结构的操作问题越来越突出,John D. Hunter开始意识到MATLAB作为一门编程语言的局限性,所以他决定使用Python重新开始。 虽然Python弥补了所有的MATLAB中的不足,但是当时却没有一款符合他心意的绘图工具。

John D. Hunter对这个绘图工具有几个要求:

  • 绘制的图像必须是可用作打印出版的高质量图像,文字显示不能有锯齿。

  • 支持PostScript语言,可将图像保存为包含Tex排版的eps格式矢量图

  • 可嵌入在图形用户界面中开发应用程序

  • 代码简单易读,可以轻松的理解与扩展

  • 绘图简便

在寻找了一通没有结果以后,John D. Hunter决定挽起袖子自己干,于是他自己用Python写一个拓展库——Matplotlib。由于没有任何计算机图形设计的实际经验, 所以John D. Hunter决定效仿他一直使用的绘图方面确实做的非常优秀的MATLAB。这样一来Matplotlib就更容易被熟悉了MATLAB的用户接受了。

在John D. Hunter看来,有一个固定的用户接口(pylab接口)是至关重要的,因为这样的话,无论开发者怎样重新设计核心代码,用户在使用的时候都不会有影响。所以,在设计时John D. Hunter将Matplotlib代码分为三个部分:

  1. 用户接口(matplotlib.pylab)。该部分是一个函数集,函数集内的函数与MATLAB的函数非常类似,所绘制的图像也极为相似,所以该部分使学习过MATLAB的用户可以很快上手Matplotlib。

  2. Matplotlib前端(Matplotlib API)。该部分是用户在使用过程中需要面对处理的部分,如绘图过程中的窗体、文本、线、图像等的创建和管理都是由该部分实现的。

  3. Matplotlib后端(Matplotlib backends)。该部分用于将用户绘制的图像展现出来。 通常我们画的图都是用Python shell直接显示出来的,但是不同的用户有不同的展示需求,如有的用户需要将图像嵌套在自己的应用程序中,有的用户需要将图像动态的展示在网站上,还有的用户需要使用脚本语言对数据进行批处理然后输出矢量图用于论文创作。针对不同的需求进行展示,并不需要用户来做大量的操作,而后端却在幕后做了大量的工作。


John D. Hunter是一位极简主义者,在设计Matplotlib的时候,他遵循的理念就是简单,所以在Matplotlib中你可以使用几行甚至一行命令就能画出图像!下面我们就来看看如何使用Matplotlib快速简便的绘制折线图、直方图、散点图以及三维图吧!

折线图

#导入库

importmatplotlib.pyplot as plt

import numpy as np

#生成数据

a = np.linspace(0,10,100)

b = np.exp(-a)

#绘制图像

plt.plot(a,b)

#显示图像

plt.show()

数据可视化,我们为什么要放弃Matlab转投Python阵营

直方图

import matplotlib.pyplot as plt

from numpy.random import normal,rand

x = normal(size=200)

plt.hist(x,bins=30)

plt.show()

数据可视化,我们为什么要放弃Matlab转投Python阵营

散点图

import matplotlib.pyplot as plt

from numpy.random import rand

a = rand(100)

b = rand(100)

plt.scatter(a,b)

plt.show()

数据可视化,我们为什么要放弃Matlab转投Python阵营

三维图

from matplotlib import cm

from mpl_toolkits.mplot3d import Axes3D

import matplotlib.pyplot as plt

import numpy as np

fig = plt.figure()

ax = fig.gca(projection='3d')

X = np.arange(-5, 5, 0.25)

Y = np.arange(-5, 5, 0.25)

X, Y = np.meshgrid(X, Y)

R = np.sqrt(X**2+ Y**2)

Z = np.sin(R)

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm)

plt.show()

数据可视化,我们为什么要放弃Matlab转投Python阵营

想了解更多Matplotlib内容,跟着Matplotlib小讲堂一起学习吧!

数据可视化,我们为什么要放弃Matlab转投Python阵营

数据可视化,我们为什么要放弃Matlab转投Python阵营

数据可视化,我们为什么要放弃Matlab转投Python阵营

数据可视化,我们为什么要放弃Matlab转投Python阵营

数据可视化,我们为什么要放弃Matlab转投Python阵营

数据可视化,我们为什么要放弃Matlab转投Python阵营


分享到:


相關文章: