1 關(guān)于安裝 問(wèn)1:Python畫(huà)圖用到哪些庫(kù)? 答:Python常用的繪圖庫(kù)有: matplotlib,是最經(jīng)典的Python可視化繪圖庫(kù)。matplotlib就是MATLAB+Plot+Library,即模仿Matlab的繪圖庫(kù),其繪圖風(fēng)格與Matlab類(lèi)似。 seaborn,是基于matplotlib的,純粹由Python開(kāi)發(fā)的圖形可視化庫(kù),在matplotlib的基礎(chǔ)上進(jìn)行了更高級(jí)的API封裝,從而使得作圖更加容易。'make a well-defined set of hard things easy',“默認(rèn)情況下就能創(chuàng)建賞心悅目的圖表”。 basemap,Python的basemap庫(kù)負(fù)責(zé)實(shí)現(xiàn)地理信息可視化,其功能之強(qiáng)大較GMT有過(guò)之而無(wú)不及。其底圖數(shù)據(jù)庫(kù)與GMT相同,封裝了大量常用的地圖投影、坐標(biāo)轉(zhuǎn)換功能,利用簡(jiǎn)潔的Python語(yǔ)法支持繪出多種多樣的地理地圖。 筆者常用matplotlib和basemap庫(kù),下一步打算學(xué)習(xí)和使用seaborn庫(kù)。 問(wèn)2:Python繪圖庫(kù)大不大?這些庫(kù)能在哪里找?安裝是否麻煩? 答:以上繪圖庫(kù)安裝包大小在100M以內(nèi)。安裝及卸載十分簡(jiǎn)單。大部分庫(kù)支持在線安裝。 控制臺(tái)使用pip install matplotlib命令即可安裝matplotlib庫(kù)。安裝之前需要先安裝numpy,dateutil模塊,安裝命令分別為pip install numpy / pip install python-dateutil。此外,安裝Pillow庫(kù),可以支持導(dǎo)出更多的如JPEG、BMP、TIFF等更多圖片格式。 seaborn的安裝同matplotlib,pip install seaborn。其依賴庫(kù)包括numpy,scipy,matplotlib,pandas。 basemap的安裝略微不同。(Windows用戶)需要到https://www.lfd./~gohlke/pythonlibs/ 下載對(duì)應(yīng)的wheel文件到本地,然后控制臺(tái)進(jìn)入其所在目錄,使用pip install xxxx.whl安裝。其依賴于pyproj庫(kù)。具體安裝過(guò)程參考 https://zhuanlan.zhihu.com/p/34509847 2 與其他工具對(duì)比 問(wèn)3.1:任何Matlab能畫(huà)的圖Python都能畫(huà)嗎? 問(wèn)3.2:從Matlab畫(huà)圖轉(zhuǎn)向Python畫(huà)圖是否容易? 答:由于 matplotlib 使用的大部分函數(shù)都與 Matlab 中對(duì)應(yīng)的函數(shù)同名,且各種參數(shù)的含義,使用方法也一致,這就使得熟悉 Matlab 的用戶使用起來(lái)感到得心應(yīng)手。對(duì)那些不熟悉的 Matlab 的用戶而言,這些函數(shù)的意義往往也是一目了然的,因此只要花很少的時(shí)間就可以掌握。 當(dāng)前新版本的 Matlab 安裝包接近 10G!!安裝后占用空間更大?。?!且正版軟件價(jià)格不菲。 Python的各個(gè)庫(kù)類(lèi)似積木的基本單位,可以隨意組合。在 Python 基本模塊外擴(kuò)展畫(huà)圖功能只需安裝 matplotlib 和numpy、pillow等幾個(gè)依賴庫(kù)。繪圖包本身大小僅有幾十M,安裝后占用空間幾百M(fèi),安裝和卸載都十分方便。另外,Python 繪圖庫(kù)開(kāi)源而且免費(fèi)。 筆者曾分別或同時(shí)使用過(guò)Excel、Matlab、Origin、GMT畫(huà)過(guò)圖?,F(xiàn)在只使用Python可以取代上面所有軟件畫(huà)圖。 問(wèn)4.1:能否像Matlab一樣拖入文件右鍵plot就能畫(huà)? 問(wèn)4.2:Python 畫(huà)圖后微調(diào)是否需要慢慢修改代碼,是否具有Matlab那種直接在圖上操作的功能? 答:matplotlib和basemap庫(kù)需要通過(guò)代碼讀取數(shù)據(jù)繪圖,暫不支持直接拖入數(shù)據(jù)右鍵繪圖,或在圖上直接操作的功能。不確定其他庫(kù),或者未來(lái)是否會(huì)出現(xiàn)新的擴(kuò)展庫(kù)支持這些操作。這或許是Python畫(huà)圖相對(duì)Matlab的一個(gè)小缺點(diǎn)。 不過(guò)格式整齊的文本數(shù)據(jù)使用numpy.loadtxt函數(shù),1-2行代碼即可提取出所需數(shù)據(jù)。Python也支持對(duì)csv、excel格式數(shù)據(jù)的快速讀取。微調(diào)繪圖結(jié)果可通過(guò)改變代碼很快設(shè)置完成。對(duì)筆者來(lái)說(shuō),上面兩個(gè)問(wèn)題幾乎可以忽略。 3 基本操作 問(wèn)5:Python畫(huà)圖代碼的可讀性如何,圖形種類(lèi)多不多? 答:引用一個(gè)說(shuō)法,Python的哲學(xué)就是“優(yōu)雅”、“明確”、“簡(jiǎn)單”,盡量寫(xiě)容易看明白的代碼,盡量寫(xiě)少的代碼。這是Python的定位,使得Python程序看上去簡(jiǎn)單易懂,初學(xué)者容易入門(mén),學(xué)習(xí)成本更低。 以最常用的matplotlib庫(kù)為例,Python可以繪制多種形式,包括普通的點(diǎn)線圖,柱狀圖、直方圖,餅圖,功率譜圖,極坐標(biāo)圖以及誤差線圖等。參考matplotlib的官方網(wǎng)站https:///index.html,在其examples頁(yè)面,給出了上百個(gè)常用的繪圖腳本及成圖樣例。 問(wèn)6:如何批量進(jìn)行成圖處理? 答:假定已經(jīng)寫(xiě)好了讀文件A畫(huà)A.jpg的函數(shù)。得到所有待繪圖文件A,B,C,的路徑后,通過(guò)for循環(huán)即可批量成圖。例如: import os names = os.listdir(mydir) for nm in names: if not nm.endswith( '.txt' ): continue pth = os.path.join(mydir, nm) draw_1_txt(pth) 問(wèn)7:Python的圖片如何保存為jpg,bmp,tif等常見(jiàn)格式? 答:matplotlib支持導(dǎo)出emf,eps,pdf,png,ps,raw,rgba,svg,svgz圖片格式。安裝Pillow庫(kù)之后,matplotlib可以自動(dòng)調(diào)用Pillow支持導(dǎo)出bmp、eps、gif、jpeg、jpg、tiff等多種格式。 問(wèn)8:是否方便畫(huà)雙y軸,設(shè)置雙軸顏色? 答:方便。一個(gè)例子如下: import numpy as np import matplotlib.pyplot as plt # Create some mock data t = np.arange( 0.01 , 10.0 , 0.01 ) data1 = np.exp(t) data2 = np.sin( 2 * np.pi * t) fig, ax1 = plt.subplots(figsize=( 5 , 3 )) color = 'tab:red' ax1.set_xlabel( 'time (s)' ) ax1.set_ylabel( 'exp' , color=color) ax1.plot(t, data1, color=color) ax1.tick_params(axis= 'y' , labelcolor=color) ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis color = 'tab:blue' ax2.set_ylabel( 'sin' , color=color) # we already handled the x-label with ax1 ax2.plot(t, data2, color=color) ax2.tick_params(axis= 'y' , labelcolor=color) fig.tight_layout() # otherwise the right y-label is slightly clipped plt.show() 可以看到,ax2=ax1.twinx()語(yǔ)句可以獲取第二個(gè)y軸元素。對(duì)于軸線屬性如label顏色、大小,tick的間隔,文字,顏色等的設(shè)置都可以通過(guò)相應(yīng)的成員函數(shù)實(shí)現(xiàn)。 問(wèn)9.1:圖片清晰度和分辨率是否能自己控制? 問(wèn)9.2:如何設(shè)置圖片分辨率,dpi等參數(shù)? 答:配合設(shè)置figsize和dpi這兩個(gè)參數(shù)調(diào)整圖片像素和分辨率。 通過(guò)figsize參數(shù)設(shè)置畫(huà)幅大小,單位為英寸:plt.figure(figsize=(8,4)) savefig保存圖片時(shí)可通過(guò)可選參數(shù)dpi設(shè)置。有的期刊網(wǎng)站要求dpi不低于300。 4 高級(jí)操作 問(wèn)10:如何用Python畫(huà)世界地圖? from mpl_toolkits.basemap import Basemap import numpy as np import matplotlib.pyplot as plt # lon_0 is central longitude of projection. # resolution = 'c' means use crude resolution coastlines. f = plt.figure(figsize=( 8 , 4 )) m = Basemap (projection= 'robin' ,lon_0= 0 ,resolution= 'c' ) m.shadedrelief(scale= 0.2 ) plt.title( 'Robinson Projection' ) plt.show() 問(wèn)11:圖片如何裁去多余的白邊? 答:在保存圖片 savefig() 時(shí)的參數(shù)中添加 bboxinches = 'tight',就可以去除因?yàn)楫?huà)幅過(guò)大導(dǎo)致圖片上下左右的白邊。plt.savefig(‘mypic.jpg’, dpi=360, bboxinches='tight')。 另一個(gè)可以自動(dòng)調(diào)整繪圖區(qū)排列的函數(shù)是tight_layout(),主要用于自動(dòng)調(diào)整繪圖區(qū)的大小及間距,使所有的繪圖區(qū)及其標(biāo)題、坐標(biāo)軸標(biāo)簽等都可以協(xié)調(diào)、完整地顯示在畫(huà)布上。例如可以避免當(dāng)繪圖區(qū)的X/Y軸的標(biāo)簽,以及標(biāo)題的字體非常大,導(dǎo)致這些文字不能完整顯示出來(lái)。也可以避免創(chuàng)建了多個(gè)繪圖區(qū),繪圖區(qū)之間有部分重疊的問(wèn)題。 問(wèn)12:多副子圖如何共用x/y坐標(biāo)軸? 答:多副子圖共用坐標(biāo)軸用sharex/sharey參數(shù)。如 fig, axs = plt.subplots(1, 3, sharey=True, figsize=(10, 3.5)) 表示從左至右三幅子圖共用y軸,只會(huì)在左子圖上繪制y軸。 問(wèn)13:怎么樣調(diào)節(jié)子圖之間的水平/垂直間隔? 答:接上面的例子,加入代碼 fig.subplots_adjust(wspace=0.05) 可以調(diào)整三幅子圖的水平間隔。垂直間隔設(shè)置hspace參數(shù)。 問(wèn)14:x坐標(biāo)軸如何顯示時(shí)間? 答:具體例子如下: import matplotlib.dates as mdates from matplotlib.pylab import date2num import datetime tmFmt = mdates. DateFormatter ( '%H:%M:%S' ) def draw_fig_xaxis_time(): ... tmfl = date2num(time_lst) plt.plot(time_lst, y_lst) ax = plt.subplot( 111 ) ax.xaxis.set_major_formatter(tmFmt) ax.set_xlim(min(tmfl)- 0.0001 , max(tmfl)+ 0.0001 ) ... 5 其他 問(wèn)15:推薦哪些網(wǎng)站和資料? 答:首推matplotlib的官方網(wǎng)站https:///index.html,在其examples頁(yè)面,給出了上百個(gè)常用的繪圖腳本及成圖樣例。 其次,多用搜索引擎Google,99.9%的畫(huà)圖問(wèn)題都可以在里面找到答案。 問(wèn)16:Python畫(huà)圖的優(yōu)點(diǎn)? 答:簡(jiǎn)單總結(jié)下,Python畫(huà)圖優(yōu)點(diǎn)有:
問(wèn)17:Python畫(huà)圖有什么缺陷? 答:個(gè)人覺(jué)得以下方面還可以繼續(xù)改進(jìn):
|
|