選單

從零開始學Python視覺化(一):極速上手

從零開始學Python畫圖(一): 極速上手

首先,不能馬上讓人上手的教程,就是耍流氓。

我們都知道,matplotlib是Python下一個極其強大的作相簿。但是它雖然強大,卻有著陡峭的學習曲線,想要用它來靈活地作圖需要花費大量的學習時間,這也是為什麼近年來基於matplotlib封裝的Seaborn等作相簿迅速流行起來的原因。

我們希望能迅速上手一個工具並畫出美觀而有說服力、有解釋力的圖形,而不是花費大量的時間卻仍然飄在雲裡霧裡。

matplotlib有兩種語言風格,一種是沿襲自MatLab的命令式風格,一種是Python的面向物件風格。不同的作圖風格有時會讓我們感到混亂,這也在無形中增加了我們的學習難度。不過我們今天不是來討論風格優劣的,我們今天的目的是熟悉matplotlib的基本作圖函式,以達到快速上手Python視覺化的目的。

今天,我們先拋卻又臭又長的官方文件,拋卻龐大的作圖知識體系,嘗試在30分鐘內掌握基本的作圖能力。

我們先從最常用的作圖函式以及樣式調整函式學起,其他的讓它們先玩兒去吧。

歡迎大家關注我的個人部落格【數洞】(www。data-insights。cn)程式碼排版有問題的可以直接去我的部落格閱讀。

1。 plot()

plot()函式包含了很多基礎的繪圖功能,這裡我們用它來繪製線圖,用以展現資料的變化趨勢。

import matplotlib。pyplot as pltimport numpy as np# 生成資料x = np。linspace(0, 10, 1000)y = np。sin(x)# 使用plt。plot()繪圖# lw ~ line width,用於設定線條寬度# ‘-r’是說線條使用正常的連續曲線,顏色使用紅色# label設定線條的標籤,我們會在圖例中看到它plt。plot(x, y, ls=‘-r’, lw=2, label=‘sin(x)’)plt。legend()plt。show()

從零開始學Python視覺化(一):極速上手

2。 scatter()

scatter()函式用以繪製散點圖,我們常用它來觀察變數間的相關性。

import matplotlib。pyplot as pltimport numpy as np# 生成資料x = np。linspace(0, 10, 100)y = np。random。rand(100)# 使用plt。scatter()繪圖# c ~ color,用於設定顏色# alpha用於控制透明度plt。scatter(x, y, c=‘g’, alpha=0。5, label=‘scatters’)plt。legend()plt。show()

從零開始學Python視覺化(一):極速上手

3。 xlim() / ylim()

這兩個函式用於設定座標軸的數值顯示範圍。

import matplotlib。pyplot as pltimport numpy as np# 生成資料x = np。linspace(0, 10, 100)y = np。random。rand(100)# 使用scatter繪圖plt。scatter(x, y, label=‘scatters’)plt。legend()# 使用xlim()/ylim()調整座標軸# 我們需要上下(左右)兩個邊界的數值plt。xlim(2, 10)plt。ylim(-0。2, 1。2)plt。show()

可以看到,雖然我們資料的範圍是x ∈ [0, 10], y ∈ [0, 1],但在我們的強烈要求下,圖片上只展示出了其中的一部分。

從零開始學Python視覺化(一):極速上手

4。 xlabel() / ylabel()

顧名思義,這兩個函式用於設定座標軸的標籤。

import matplotlib。pyplot as pltimport numpy as np# 生成資料x = np。linspace(0, 10, 100)y = np。sin(x)# 使用scatter繪圖# ls ~ line style,用於設定線條型別plt。plot(x, y, ls=‘-。’, lw=2, c=‘g’, label=‘sin(x)’)plt。legend()# 使用xlim()/ylim()調整座標軸plt。xlabel(‘x-axis’)plt。ylabel(‘y-axis’)plt。show()

從零開始學Python視覺化(一):極速上手

5。 grid()

就喜歡這麼直白的命名,grid()函式正是用於設定圖形中的網格線。

import matplotlib。pyplot as pltimport numpy as np# 生成資料x = np。linspace(0, 10, 100)y = np。sin(x)# 使用scatter繪圖plt。plot(x, y, ls=‘-。’, lw=2, c=‘c’, label=‘sin(x)’)plt。legend()# 使用grid()調整網格線# linestyle用於設定網格的線條型別,color用於設定網格的線條顏色plt。grid(linestyle=‘:’, color=‘r’)plt。show()

從零開始學Python視覺化(一):極速上手

6。 axhline() / axvline()

ax ~ axis

h ~ horizontal,水平的

v ~ vertical,垂直的

組合起來看,我們可以猜到,這兩個函式分別用於設定水平參考線和垂直參考線。

import matplotlib。pyplot as pltimport numpy as np# 生成資料x = np。linspace(0, 10, 100)y = np。sin(x)# 使用scatter繪圖plt。plot(x, y, ls=‘-。’, lw=2, c=‘c’, label=‘sin(x)’)plt。legend()# 這裡的引數跟之前幾個函式的引數類似,不再贅述plt。axhline(y=0, c=‘r’, ls=‘——’, lw=2)plt。axvline(x=5, c=‘g’, ls=‘-。’, lw=2)plt。show()

從零開始學Python視覺化(一):極速上手

7。 axhspan() / axvspan()

ax ~ axis

h ~ horizontal,水平的

v ~ vertical,垂直的

span ~ 跨度,區間,範圍

這兩個函式分別用於設定平行於x軸/y軸的參考區域。

import matplotlib。pyplot as pltimport numpy as np# 生成資料x = np。linspace(0, 10, 100)y = np。sin(x)# 使用scatter繪圖plt。plot(x, y, ls=‘-。’, lw=2, c=‘c’, label=‘sin(x)’)plt。legend()# xmin/xmax/ymin/ymax用於設定區間範圍# facecolor用於設定區域顏色# alpha用於設定透明度plt。axhspan(ymin=-0。25, ymax=0。25, facecolor=‘purple’, alpha=0。3)plt。axvspan(xmin=4, xmax=6, facecolor=‘g’, alpha=0。3)plt。show()

從零開始學Python視覺化(一):極速上手

8。 annotate()

這個函式就是為了在圖形中新增指向性註釋文字,為了能靈活調整註釋的位置以及指示箭頭的樣式,這個函式提供了豐富的可選引數,想要熟練使用這一函式需要我們花一些功夫去探索。

import matplotlib。pyplot as pltimport numpy as np# 生成資料x = np。linspace(0, 10, 100)y = np。sin(x)# 使用scatter繪圖plt。plot(x, y, ls=‘-。’, lw=2, c=‘c’, label=‘sin(x)’)plt。legend()# 這裡的引數跟之前幾個函式的引數類似,不再贅述plt。axhspan(ymin=-0。25, ymax=0。25, facecolor=‘purple’, alpha=0。3)plt。axvspan(xmin=4, xmax=6, facecolor=‘g’, alpha=0。3)# 使用annotate()添加註釋plt。annotate(‘maximum’, xy = (np。pi * 3 / 2, -1), xytext = (np。pi * 3 / 2 - 0。6, -0。7), weight = ‘bold’, color = ‘r’, arrowprops = { ‘arrowstyle’: ‘->’, ‘connectionstyle’: ‘arc3’, ‘color’: ‘r’, ‘alpha’: 0。3 })plt。show()

可以看到,我們為(π/2, -1)位置的最低點加了一個“minimum”的紅色文字註釋,這裡邊我們用到了以下的配置項,它們的含義是:

xy: 指示點的座標,即我們希望註釋箭頭指向的點的座標

xytext: 註釋文字左端的座標(不是文字中心的座標)

weight: 註釋文字的字型粗細風格,bold是粗體,正常粗細則用regular

color: 註釋文字的顏色

arrowprops: arrow + props(properties),箭頭屬性,字典格式

arrowstyle: 箭頭型別

connectionstyle: 連線型別

color: 箭頭顏色

更多的引數大家可以查閱文件,裡邊有詳細的介紹。至於查閱文件,為大家推薦一個軟體,在Mac下有一個叫Dash的軟體,簡直是文件查閱神器,在Linux和Windows下有一個叫Zeal的替代軟體。強烈推薦沒用過的同學體驗下。

從零開始學Python視覺化(一):極速上手

9。 text()

這個函式同樣是用於圖形中的註釋,但它跟annotate()的區別是它用於新增無指向性註釋文字,也就是不帶指向性箭頭的文字註釋。

import matplotlib。pyplot as pltimport numpy as np# 生成資料x = np。linspace(0, 10, 100)y = np。sin(x)# 使用scatter繪圖plt。plot(x, y, ls=‘-。’, lw=2, c=‘c’, label=‘sin(x)’)plt。legend()# 這裡的引數跟之前幾個函式的引數類似,不再贅述plt。axhspan(ymin=-0。25, ymax=0。25, facecolor=‘purple’, alpha=0。3)plt。axvspan(xmin=np。pi*3/2-1, xmax=np。pi*3/2+1, facecolor=‘g’, alpha=0。3)# 使用annotate()添加註釋plt。text(np。pi * 3 / 2 - 0。7, -0。7, ‘minimum’, weight=‘regular’, color=‘r’, fontsize=12)plt。text(np。pi * 3 / 2 - 1, 0。7, ‘y=sin(x)’, weight=‘regular’, color=‘r’, fontsize=16)plt。show()

由於沒有了箭頭,我們就不需要那個字典引數了,同時座標等引數都更直接地使用x、y等來表達。我們使用fontsize引數設定了註釋文字的大小。

從零開始學Python視覺化(一):極速上手

10。 title()

這個函式最簡單,就是用於設定圖形的標題。

import matplotlib。pyplot as pltimport numpy as np# 生成資料x = np。linspace(0, 10, 100)y = np。sin(x)# 使用scatter繪圖plt。plot(x, y, ls=‘-。’, lw=2, c=‘c’, label=‘sin(x)’)plt。legend()# 設定標題plt。title(‘A Sine Curve’)plt。show()

從零開始學Python視覺化(一):極速上手

11。 legend()

這個函式我們已經見過好多次了,它用於新增圖例。

10。 title()

這個函式最簡單,就是用於設定圖形的標題。

import matplotlib。pyplot as pltimport numpy as np# 生成資料x = np。linspace(0, 10, 100)y = np。sin(x)# 使用scatter繪圖plt。plot(x, y, ls=‘-。’, lw=2, c=‘c’, label=‘sin(x)’)# 控制圖例位置plt。legend(loc=‘lower right’)# 設定標題plt。title(‘A Sine Curve’)plt。show()

這裡我們將圖例放在了右下角,圖例的位置使用loc引數來控制:

upper left: 左上角

upper center: 中上

upper right: 右上角

lower left: 左下角

lower center: 中下

lower right: 右下角

從零開始學Python視覺化(一):極速上手

12。 小挑戰

在最後,我們用一個小挑戰來回顧下之前的內容:

import matplotlib。pyplot as pltimport numpy as npfrom matplotlib import cm as cm# 生成資料x = np。linspace(0。5, 3。5, 100)y = np。sin(x)y1 = np。random。randn(100)# 建立圖形並設定大小plt。figure(figsize=(12, 8))# 散點圖plt。scatter(x, y1, c=‘0。5’, label=‘scatters’)# sin(x)圖plt。plot(x, y, ‘——g’, lw=2, label=‘sin(x)’)# 樣式調整# 去掉圖形上邊和右側的邊框for spine in plt。gca()。spines。keys(): if spine == ‘top’ or spine == ‘right’: plt。gca()。spines[spine]。set_color(‘none’) # 設定座標軸上的刻度線位置(其實這裡的設定跟預設一樣)plt。gca()。xaxis。set_ticks_position(‘bottom’)plt。gca()。yaxis。set_ticks_position(‘left’)# 將刻度線放在座標軸內側plt。tick_params(direction = ‘in’)# 設定座標軸範圍plt。xlim(0, 4)plt。ylim(-3, 3)# 設定軸標籤plt。xlabel(‘X 軸’)plt。ylabel(‘Y 軸’)# 設定網格線plt。grid(True, ls=‘:’, color=‘r’, alpha=0。5)# 新增水平參考線plt。axhline(y=0, c=‘r’, ls=‘——’, lw=2)# 新增垂直參考區間plt。axvspan(xmin=1, xmax=2, facecolor=‘g’, alpha=0。1)# 新增sin(x)的最高點註釋plt。annotate(‘maximum’, xy = (np。pi/2, 1), xytext = (np。pi/2, 1。3), weight = ‘regular’, color = ‘r’, fontsize = 12, arrowprops = { ‘arrowstyle’: ‘->’, ‘connectionstyle’: ‘arc3’, ‘color’: ‘r’ }) # 新增y軸邊框註釋plt。annotate(‘spines’, xy = (0, -2。5), xytext = (0。25, -2。3), weight = ‘regular’, color = ‘c’, fontsize = 12, arrowprops = { ‘arrowstyle’: ‘->’, ‘connectionstyle’: ‘arc3’, ‘color’: ‘c’ }) # 新增x軸邊框註釋plt。annotate(‘’, xy = (0。25, -3), xytext = (0。37, -2。4), arrowprops = { ‘arrowstyle’: ‘->’, ‘connectionstyle’: ‘arc3’, ‘color’: ‘c’ }) # 新增一個指向tick的箭頭plt。annotate(‘’, xy = (3。5, -2。98), xytext = (3。6, -2。7), arrowprops = { ‘arrowstyle’: ‘->’, ‘connectionstyle’: ‘arc3’, ‘color’: ‘c’ })# 在上邊的箭頭旁添加註釋文字plt。text(3。6, -2。7, “‘|’ is tickline”, weight=‘bold’, color=‘c’)plt。text(3。6, -2。9, “3。5 is ticklabel”, weight=‘bold’, color=‘c’)# 設定標題plt。title(‘Structure of matplotlib’)# 新增圖例plt。legend()# 展示圖形plt。show()

可以看到,我們配置了很多小細節,是不是很有成就感?

沒錯,matplotlib就是這麼強大,這還僅僅是它的冰山一角呢!

從零開始學Python視覺化(一):極速上手

好了,以上就是用來作圖以及調整圖形樣式的十來個常用的函式,本文嚴重參考劉大成先生的《Python資料視覺化之matplotlib實踐》一書,這本書的組織形式是截止目前我認為講解matplotlib庫中最清晰、最適合新手的,強烈推薦。