Python新手繪圖繞不開的17個小tip

Python新手繪圖繞不開的17個小tip

1.關於python安裝

問1:Python畫圖用到哪些庫?

答:Python常用的繪圖庫有:

matplotlib,是最經典的Python可視化繪圖庫。matplotlib就是MATLAB+Plot+Library,即模仿Matlab的繪圖庫,其繪圖風格與Matlab類似。

seaborn,是基於matplotlib的,純粹由Python開發的圖形可視化庫,在matplotlib的基礎上進行了更高級的API封裝,從而使得作圖更加容易。"make a well-defined set of hard things easy",“默認情況下就能創建賞心悅目的圖表”。

basemap,Python的basemap庫負責實現地理信息可視化,其功能之強大較GMT有過之而無不及。其地圖數據庫與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.uci.edu/~gohlke/pythonlibs/ 下載對應的wheel文件到本地,然後控制檯進入其所在目錄,使用pip install xxxx.whl安裝。其依賴於pyproj庫。

2 .與其他工具對比

問3.1:任何Matlab能畫的圖Python都能畫嗎?

問3.2:從Matlab畫圖轉向Python畫圖是否容易?

答:由於 matplotlib 使用的大部分函數都與 Matlab 中對應的函數同名,且各種參數的含義,使用方法也一致,這就使得熟悉 Matlab 的用戶使用起來感到得心應手。對那些不熟悉的 Matlab 的用戶而言,這些函數的意義往往也是一目瞭然的,因此只要花很少的時間就可以掌握。

當前新版本的 Matlab 安裝包接近 10G!!安裝後佔用空間更大!!!且正版軟件價格不菲。

Python的各個庫類似積木的基本單位,可以隨意組合。在 Python 基本模塊外擴展畫圖功能只需安裝 matplotlib 和numpy、pillow等幾個依賴庫。繪圖包本身大小僅有幾十M,安裝後佔用空間幾百M,安裝和卸載都十分方便。另外,Python 繪圖庫開源而且免費。

筆者曾分別或同時使用過Excel、Matlab、Origin、GMT畫過圖。現在只使用Python可以取代上面所有軟件畫圖。

問4.1:能否像Matlab一樣拖入文件右鍵plot就能畫?

問4.2:Python 畫圖後微調是否需要慢慢修改代碼,是否具有Matlab那種直接在圖上操作的功能?

答:matplotlib和basemap庫需要通過代碼讀取數據繪圖,暫不支持直接拖入數據右鍵繪圖,或在圖上直接操作的功能。不確定其他庫,或者未來是否會出現新的擴展庫支持這些操作。這或許是Python畫圖相對Matlab的一個小缺點。

不過格式整齊的文本數據使用numpy.loadtxt函數,1-2行代碼即可提取出所需數據。

Python也支持對csv、excel格式數據的快速讀取。微調繪圖結果可通過改變代碼很快設置完成。

對筆者來說,上面兩個問題幾乎可以忽略。


3 .基本操作

問5:Python畫圖代碼的可讀性如何,圖形種類多不多?

答:引用一個說法,Python的哲學就是“優雅”、“明確”、“簡單”,儘量寫容易看明白的代碼,儘量寫少的代碼。

這是Python的定位,使得Python程序看上去簡單易懂,初學者容易入門,學習成本更低。

以最常用的matplotlib庫為例,Python可以繪製多種形式,包括普通的點線圖,柱狀圖、直方圖,餅圖,功率譜圖,極座標圖以及誤差線圖等。

問6:如何批量進行成圖處理?

答:假定已經寫好了讀文件A畫A.jpg的函數。得到所有待繪圖文件A,B,C,的路徑後,通過for循環即可批量成圖。例如:

<code>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)/<code>

問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軸,設置雙軸顏色?

答:方便。一個例子如下:

<code>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()/<code>
Python新手繪圖繞不開的17個小tip

可以看到,ax2=ax1.twinx()語句可以獲取第二個y軸元素。

對於軸線屬性如label顏色、大小,tick的間隔,文字,顏色等的設置都可以通過相應的成員函數實現。

問9.1:圖片清晰度和分辨率是否能自己控制?

問9.2:如何設置圖片分辨率,dpi等參數?

答:配合設置figsize和dpi這兩個參數調整圖片像素和分辨率。

通過figsize參數設置畫幅大小,單位為英寸:plt.figure(figsize=(8,4)) savefig保存圖片時可通過可選參數dpi設置。

有的期刊網站要求dpi不低於300。


4 高級操作

問10:如何用Python畫世界地圖?

<code>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()/<code>

問11:圖片如何裁去多餘的白邊?

答:在保存圖片 savefig() 時的參數中添加 bboxinches = 'tight',就可以去除因為畫幅過大導致圖片上下左右的白邊。plt.savefig(‘mypic.jpg’, dpi=360, bboxinches='tight')。

另一個可以自動調整繪圖區排列的函數是tight_layout(),主要用於自動調整繪圖區的大小及間距,使所有的繪圖區及其標題、座標軸標籤等都可以協調、完整地顯示在畫布上。

例如可以避免當繪圖區的X/Y軸的標籤,以及標題的字體非常大,導致這些文字不能完整顯示出來。

也可以避免創建了多個繪圖區,繪圖區之間有部分重疊的問題。

問12:多副子圖如何共用x/y座標軸?

答:多副子圖共用座標軸用sharex/sharey參數。

如 fig, axs = plt.subplots(1, 3, sharey=True, figsize=(10, 3.5)) 表示從左至右三幅子圖共用y軸,只會在左子圖上繪製y軸。

問13:怎麼樣調節子圖之間的水平/垂直間隔?

答:接上面的例子,加入代碼 fig.subplots_adjust(wspace=0.05) 可以調整三幅子圖的水平間隔。

垂直間隔設置hspace參數。

問14:x座標軸如何顯示時間?

答:具體例子如下:

<code>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)
.../<code>
Python新手繪圖繞不開的17個小tip

5 其他

問15:推薦哪些網站和資料?

答:首推matplotlib的官方網站https://matplotlib.org/index.html,在其examples頁面,給出了上百個常用的繪圖腳本及成圖樣例。 其次,多用搜索引擎Google,99.9%的畫圖問題都可以在裡面找到答案。

問16:Python畫圖的優點?

答:簡單總結下,Python畫圖優點有:

  1. 腳本語法簡單,很容易理解、上手;
  2. 跨平臺(Win/Linux/Mac),開源;
  3. 安裝簡單,佔用空間很小;
  4. 封裝了一些“高級”屬性/函數,比如支持設置dpi;支持去除圖片白邊;支持自動調整多子圖的間隔......
  5. 使用人數眾多,社區活躍。

問17:Python畫圖有什麼缺陷?

答:個人覺得以下方面還可以繼續改進:

  1. 在腳本操作之外,可以增加輔助的圖形化操作,支持類似Excel或Matlab的,文件即託即畫功能;
  2. 成圖show之後,支持在圖片上直接對軸線、線條、title等進行編輯;
  3. 簡化basemap庫安裝過程。增加GMT畫世界地圖的黑白間隔邊框效果。

最後小編幫助大家整理了一套python教程,下面展示了部分,希望也能幫助對編程感興趣,想做數據分析,人工智能、爬蟲或者希望從事編程開發的小夥伴,畢竟python工資也還可以,如果能幫到你請點贊、點贊、點贊。

Python新手繪圖繞不開的17個小tip

Python新手繪圖繞不開的17個小tip

Python新手繪圖繞不開的17個小tip

Python新手繪圖繞不開的17個小tip

Python新手繪圖繞不開的17個小tip

如果覺得這篇文章對你有益的話,麻煩點個贊關注多多支持下!


分享到:


相關文章: