為什么大家最先接觸到的科學計算和可視化工具都是MATLAB?
“為什么大家最先接觸到的科學計算和數據可視化工具都是MATLAB?”
其實在討論這個問題的時候,我們首先應該考慮到的是時間的局限性。
對于老一輩的人,最先使用的科學計算語言是FORTRAN。FORTRAN誕生于1951年,是世界上最早出現的計算機高級程序設計語言,所以在那個年代FORTRAN是最好的選擇。后來,這批最先使用FORTRAN的人,在科研以及教學領域逐漸成為了領頭羊,他們在工作中創作出了無數久經考驗的優質代碼,所以他們所帶領的團隊、所教授的學生中最先接觸的必是FORTRAN。
隨著時間的推移,在老一輩科學家帶領下成長起來的人成為了行業里新的領頭羊,這一代人在成長的過程中所能接觸到的科學計算工具已經不止FORTRAN,還有誕生于1984年MATLAB,MATLAB相比于FORTRAN,已經不光可以做科學計算了,它以矩陣運算為基礎,把計算、可視化、程序設計融合到一個交互工作環境中,可以實現工程計算、算法研究、建模和仿真、數據統計分析、工程繪圖、應用程序開發等功能。慢慢的MATLAB成為了團隊里主流的工具,大學里教授的課程也以MATLAB為主了。而這一代人正是我們年輕人大學里的導師、教授,項目中的領導。
所以針對“為什么大家最先接觸到的科學計算和數據可視化工具都是MATLAB”這個問題,可以總結出以下兩點原因:
MATLAB資格老,早批使用者大部分成為了當前教學以及行業中的領頭羊,導致學校教學過程中以MATLAB教學為主
相比于FORTRAN等更老的語言,不僅可以進行科學、工程計算,還可進行數據可視化展示。
從FORTRAN誕生到MATLAB誕生經歷了33年的時間,從1984年MATLAB誕生到2017年又是一個33年,在這期間就沒有別的語言可以替代MATLAB了嗎?MATLAB就是我們年輕人的選擇了嗎?我們沒有更好的選擇了嗎?
答案是否定的!我們不僅有MATLAB,我們還有Matplotlib!
Matplotlib是由John D. Hunter (1968 – 2012)編寫的一款強大的Python數據可視化繪圖庫。 雖然它源于模仿MATLAB,但是它卻不同于MATLAB,與MATLAB相比它的優勢在于:
免費。MATLAB是一款商業軟件,價格不菲;而Matplotlib是開源免費的。
Matplotlib是Python的拓展庫,所以繼承了Python語法的優點,面向對象、易讀、易維護、代碼簡潔優美。
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代碼分為三個部分:
用戶接口(matplotlib.pylab)。該部分是一個函數集,函數集內的函數與MATLAB的函數非常類似,所繪制的圖像也極為相似,所以該部分使學習過MATLAB的用戶可以很快上手Matplotlib。
Matplotlib前端(Matplotlib API)。該部分是用戶在使用過程中需要面對處理的部分,如繪圖過程中的窗體、文本、線、圖像等的創建和管理都是由該部分實現的。
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()
直方圖import matplotlib.pyplot as plt
from numpy.random import normal,rand
x = normal(size=200)
plt.hist(x,bins=30)
plt.show()
散點圖import matplotlib.pyplot as plt
from numpy.random import rand
a = rand(100)
b = rand(100)
plt.scatter(a,b)
plt.show()
三維圖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()
想了解更多Matplotlib內容,跟著Matplotlib小講堂一起學習吧!