1 關于安裝 問1:Python畫圖用到哪些庫? 答:Python常用的繪圖庫有: matplotlib,是最經典的Python可視化繪圖庫。matplotlib就是MATLAB+Plot+Library,即模仿Matlab的繪圖庫,其繪圖風格與Matlab類似。 seaborn,是基于matplotlib的,純粹由Python開發(fā)的圖形可視化庫,在matplotlib的基礎上進行了更高級的API封裝,從而使得作圖更加容易。'make a well-defined set of hard things easy',“默認情況下就能創(chuàng)建賞心悅目的圖表”。 basemap,Python的basemap庫負責實現(xiàn)地理信息可視化,其功能之強大較GMT有過之而無不及。其底圖數(shù)據庫與GMT相同,封裝了大量常用的地圖投影、坐標轉換功能,利用簡潔的Python語法支持繪出多種多樣的地理地圖。 筆者常用matplotlib和basemap庫,下一步打算學習和使用seaborn庫。 問2:Python繪圖庫大不大?這些庫能在哪里找?安裝是否麻煩? 答:以上繪圖庫安裝包大小在100M以內。安裝及卸載十分簡單。大部分庫支持在線安裝。 控制臺使用pip install matplotlib命令即可安裝matplotlib庫。安裝之前需要先安裝numpy,dateutil模塊,安裝命令分別為pip install numpy / pip install python-dateutil。此外,安裝Pillow庫,可以支持導出更多的如JPEG、BMP、TIFF等更多圖片格式。 seaborn的安裝同matplotlib,pip install seaborn。其依賴庫包括numpy,scipy,matplotlib,pandas。 basemap的安裝略微不同。(Windows用戶)需要到https://www.lfd./~gohlke/pythonlibs/ 下載對應的wheel文件到本地,然后控制臺進入其所在目錄,使用pip install xxxx.whl安裝。其依賴于pyproj庫。具體安裝過程參考 https://zhuanlan.zhihu.com/p/34509847 2 與其他工具對比 問3.1:任何Matlab能畫的圖Python都能畫嗎? 問3.2:從Matlab畫圖轉向Python畫圖是否容易? 答:由于 matplotlib 使用的大部分函數(shù)都與 Matlab 中對應的函數(shù)同名,且各種參數(shù)的含義,使用方法也一致,這就使得熟悉 Matlab 的用戶使用起來感到得心應手。對那些不熟悉的 Matlab 的用戶而言,這些函數(shù)的意義往往也是一目了然的,因此只要花很少的時間就可以掌握。 當前新版本的 Matlab 安裝包接近 10G??!安裝后占用空間更大?。?!且正版軟件價格不菲。 Python的各個庫類似積木的基本單位,可以隨意組合。在 Python 基本模塊外擴展畫圖功能只需安裝 matplotlib 和numpy、pillow等幾個依賴庫。繪圖包本身大小僅有幾十M,安裝后占用空間幾百M,安裝和卸載都十分方便。另外,Python 繪圖庫開源而且免費。 筆者曾分別或同時使用過Excel、Matlab、Origin、GMT畫過圖?,F(xiàn)在只使用Python可以取代上面所有軟件畫圖。 問4.1:能否像Matlab一樣拖入文件右鍵plot就能畫? 問4.2:Python 畫圖后微調是否需要慢慢修改代碼,是否具有Matlab那種直接在圖上操作的功能? 答:matplotlib和basemap庫需要通過代碼讀取數(shù)據繪圖,暫不支持直接拖入數(shù)據右鍵繪圖,或在圖上直接操作的功能。不確定其他庫,或者未來是否會出現(xiàn)新的擴展庫支持這些操作。這或許是Python畫圖相對Matlab的一個小缺點。 不過格式整齊的文本數(shù)據使用numpy.loadtxt函數(shù),1-2行代碼即可提取出所需數(shù)據。Python也支持對csv、excel格式數(shù)據的快速讀取。微調繪圖結果可通過改變代碼很快設置完成。對筆者來說,上面兩個問題幾乎可以忽略。 3 基本操作 問5:Python畫圖代碼的可讀性如何,圖形種類多不多? 答:引用一個說法,Python的哲學就是“優(yōu)雅”、“明確”、“簡單”,盡量寫容易看明白的代碼,盡量寫少的代碼。這是Python的定位,使得Python程序看上去簡單易懂,初學者容易入門,學習成本更低。 以最常用的matplotlib庫為例,Python可以繪制多種形式,包括普通的點線圖,柱狀圖、直方圖,餅圖,功率譜圖,極坐標圖以及誤差線圖等。參考matplotlib的官方網站https:///index.html,在其examples頁面,給出了上百個常用的繪圖腳本及成圖樣例。 問6:如何批量進行成圖處理? 答:假定已經寫好了讀文件A畫A.jpg的函數(shù)。得到所有待繪圖文件A,B,C,的路徑后,通過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) 問7:Python的圖片如何保存為jpg,bmp,tif等常見格式? 答:matplotlib支持導出emf,eps,pdf,png,ps,raw,rgba,svg,svgz圖片格式。安裝Pillow庫之后,matplotlib可以自動調用Pillow支持導出bmp、eps、gif、jpeg、jpg、tiff等多種格式。 問8:是否方便畫雙y軸,設置雙軸顏色? 答:方便。一個例子如下: 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軸元素。對于軸線屬性如label顏色、大小,tick的間隔,文字,顏色等的設置都可以通過相應的成員函數(shù)實現(xiàn)。 問9.1:圖片清晰度和分辨率是否能自己控制? 問9.2:如何設置圖片分辨率,dpi等參數(shù)? 答:配合設置figsize和dpi這兩個參數(shù)調整圖片像素和分辨率。 通過figsize參數(shù)設置畫幅大小,單位為英寸:plt.figure(figsize=(8,4)) savefig保存圖片時可通過可選參數(shù)dpi設置。有的期刊網站要求dpi不低于300。 4 高級操作 問10:如何用Python畫世界地圖? 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() 問11:圖片如何裁去多余的白邊? 答:在保存圖片 savefig() 時的參數(shù)中添加 bboxinches = 'tight',就可以去除因為畫幅過大導致圖片上下左右的白邊。plt.savefig(‘mypic.jpg’, dpi=360, bboxinches='tight')。 另一個可以自動調整繪圖區(qū)排列的函數(shù)是tight_layout(),主要用于自動調整繪圖區(qū)的大小及間距,使所有的繪圖區(qū)及其標題、坐標軸標簽等都可以協(xié)調、完整地顯示在畫布上。例如可以避免當繪圖區(qū)的X/Y軸的標簽,以及標題的字體非常大,導致這些文字不能完整顯示出來。也可以避免創(chuàng)建了多個繪圖區(qū),繪圖區(qū)之間有部分重疊的問題。 問12:多副子圖如何共用x/y坐標軸? 答:多副子圖共用坐標軸用sharex/sharey參數(shù)。如 fig, axs = plt.subplots(1, 3, sharey=True, figsize=(10, 3.5)) 表示從左至右三幅子圖共用y軸,只會在左子圖上繪制y軸。 問13:怎么樣調節(jié)子圖之間的水平/垂直間隔? 答:接上面的例子,加入代碼 fig.subplots_adjust(wspace=0.05) 可以調整三幅子圖的水平間隔。垂直間隔設置hspace參數(shù)。 問14:x坐標軸如何顯示時間? 答:具體例子如下: 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 其他 問15:推薦哪些網站和資料? 答:首推matplotlib的官方網站https:///index.html,在其examples頁面,給出了上百個常用的繪圖腳本及成圖樣例。 其次,多用搜索引擎Google,99.9%的畫圖問題都可以在里面找到答案。 問16:Python畫圖的優(yōu)點? 答:簡單總結下,Python畫圖優(yōu)點有:
問17:Python畫圖有什么缺陷? 答:個人覺得以下方面還可以繼續(xù)改進:
|
|