簡述
Matplotlib是一個基于python的2D畫圖庫,能夠用python腳本方便的畫出折線圖,直方圖,功率譜圖,散點圖等常用圖表,而且語法簡單。具體介紹見matplot官網。
Numpy(Numeric Python)是一個模仿matlab的對python數值運算進行的擴展,提供了許多高級的數值編程工具,如:矩陣數據類型、矢量處理,以及精密的運算庫。專為進行嚴格的數字處理而產生,而且據說自從他出現了以后,NASA就把很多原來用fortran和matlab做的工作交給了numpy來做了,可見其強大。。。他的官網在這里,具體的資料都在里面。
安裝
1
2
|
$sudo apt-get install python-matplotlib $sudo apt-get install python-numpy |
(牛力大法好~)
使用
matplotlib可以在腳本中使用,不過如果在ipython中使用則會更加炫(直接添加–pylab參數可以免去導包的過程),而且能得到類似Matlab/Mathematica一樣的功能,即時輸入,即時輸出。個人覺得說白了他就是模仿Matlab/Mathematica的,但是的確比前者更加方便編程。
很多情況下matplot需要配合numpy包一起用,關于numpy包我不打算分開來說,用到的時候提一下就行。有一點需要注意的是,numpy包通常是這樣導入的:
1
|
import numpy as np |
會給他起一個叫np的別名,而且這幾乎已經是約定俗成了。
在python或者ipython中輸入help(*需要查找的函數*) 就行(當然需要先導入下包)。
第一個圖像
需要導入的包:
1
2
|
import numpy as np from pylab import * |
第一個函數圖像
1
2
3
4
5
|
X = np.linspace( - np.pi, np.pi, 256 ,endpoint = True ) C,S = np.cos(X), np.sin(X) plot(X,C) plot(X,S) show() |
有matlab基礎的同學肯定不陌生。。。是的,這兩個模塊的組合幾乎就跟matlab的用法無二。。
1、首先用np.linspace
方法生成一個數組X,這個數組是從$-\pi$
開始到$\pi$
的總共包含256個元素的數組,endpoint參數表示是否包含首尾端點(他的值是True或False,首字母要大寫。。。。)。當然,這個數組就是一個普通的數組了,跟其他數組沒有區別。
2、然后用np.cos()
和np.sin()
方法作用在X數組上,對于X中的每一個元素進行計算,生成結果數組。(免去了迭代的過程)。
3、接著調用pylab的plot方法,第一個參數是橫坐標數組,第二個參數是縱坐標數組,其他參數暫且不談。這樣他會生成一個默認的圖表了。(不會立刻顯示)
4、當然,最后還要調用show方法來顯示圖表。
5、結果:
圖表的名字叫figure1,左下面有幾個按鈕,都是很實用的東西,右下角會顯示當前鼠標左邊,也很方便。
圖表布局和坐標分布
每一個圖表都是在一個figure里面,我們可以通過如下命令生成一個空的figure:
1
|
figure(figsize = ( 8 , 6 ), dpi = 80 ) |
這里參數的順序沒有要求,但是一定要加上參數名,因為他是根據參數名來區別每個參數的,是一種跟C語言類型不同的函數。figsize參數表示figure的寬高比,然后dpi表示每一份占的長度,比如這里就表示圖像是640x480的。
輸出命令之后會立刻出現一個窗口,接下來所有的plot命令都會立刻顯示在這個窗口上而不用再輸入show命令了。
一個figure里也能顯示多個圖表,我們可以用如下函數來分割一個figure:
1
|
subplot( 3 , 4 , 6 ) |
這樣就會把當前的figure分割成3行4列的表,而激活其中的第6張,即第2行第3張。以后的plot都是在這一個子表上生成的,如果需要更換則可以重新輸入subplot命令來確定其新的位置。
除此之外,如果我們對圖表顯示的范圍不滿意,我們還可以直接調整圖表的坐標范圍:
1
2
|
xlim( - 4.0 , 4.0 ) ylim( - 1.0 , 1.0 ) |
這就表示x軸的范圍設置在-4到4,y軸的范圍設置在-1到1。當然,如果是想相對的進行修改我們可以利用下numpy數組的min和max方法。比如X.min()
這樣的東西。
如果對坐標顯示的密度啊什么的不滿意,我們也可以調節他的標注點:
1
2
|
xticks(np.linspace( - 4 , 4 , 9 ,endpoint = True )) yticks(np.linspace( - 1 , 1 , 5 ,endpoint = True )) |
對于xticks和yticks,我們實際上可以傳入任意的數組,這里不過是為了方便而用numpy快速生成的等差數列。
當然,我們也可以給標注點進行任意的命名,像下面這樣:
1
|
xticks([ 1 , 2 , 3 , 4 , 5 ],[ 'one' , 'two' , 'three' , 'four' , 'five' ]) |
效果也很好想象,就不貼圖了。需要注意的是這里也可以支持LaTex語法,將LaTex引用在兩個$之間就可以了。(關于LaTex)
這里也有個小竅門,就是如果想不顯示標注的話,我們就可以直接給xticks賦一個空的數組。
更改色彩和線寬
我們可以在畫plot的時候用如下方法指定他的顏色和線寬:
1
|
plot(X, C, color = '#cadae3' , linestyle = '-' ,linewidth = 1.3 , marker = 'o' , markerfacecolor = 'blue' , markersize = 12 ,) |
同樣,這里參數的順序不重要,名字才重要。
color參數可以指定RGB的色相,也可以用一些默認的名字,比如red blue之類的。
linestyle參數則指定了線的樣式,具體參照以下樣式:
參數 | 樣式 |
---|---|
‘-‘ | 實線 |
‘–' | 虛線 |
‘-.' | 線-點 |
‘:' | 點虛線 |
linewidth參數指定折線的寬度,是個浮點數。
marker參數指定散點的樣式,具體參照以下樣式:
參數 | 樣式 |
---|---|
‘.' | 實心點 |
‘o' | 圓圈 |
‘,' | 一個像素點 |
‘x' | 叉號 |
‘+' | 十字 |
‘*' | 星號 |
‘^' ‘v' ‘<' ‘>' | 三角形(上下左右) |
‘1' ‘2' ‘3' ‘4' | 三叉號(上下左右) |
markerfacecolor參數指定marker的顏色
markersize參數指定marker的大小
這樣就基本上能夠自定義任何的折線圖、散點圖的樣式了。
移動軸線
這段有點小復雜,暫時不想具體了解奇奇怪怪的函數調用,姑且先記錄下用法和原理:
1
2
3
4
5
6
7
|
ax = gca() ax.spines[ 'right' ].set_color( 'none' ) ax.spines[ 'top' ].set_color( 'none' ) ax.xaxis.set_ticks_position( 'bottom' ) ax.spines[ 'bottom' ].set_position(( 'data' , 0 )) ax.yaxis.set_ticks_position( 'left' ) ax.spines[ 'left' ].set_position(( 'data' , 0 )) |
我們知道一張圖有上下左右四個軸線,這里我們把右邊和上邊的軸線顏色調為透明,然后把下邊設置到y軸數據為0的地方,把左邊設置到x軸數據為0的地方。這樣我們就能根據自己想要位置來調節軸線了。
比如下面這段官方的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# ----------------------------------------------------------------------------- # Copyright (c) 2015, Nicolas P. Rougier. All Rights Reserved. # Distributed under the (new) BSD License. See LICENSE.txt for more info. # ----------------------------------------------------------------------------- import numpy as np import matplotlib.pyplot as plt plt.figure(figsize = ( 8 , 5 ), dpi = 80 ) ax = plt.subplot( 111 ) ax.spines[ 'right' ].set_color( 'none' ) ax.spines[ 'top' ].set_color( 'none' ) ax.xaxis.set_ticks_position( 'bottom' ) ax.spines[ 'bottom' ].set_position(( 'data' , 0 )) ax.yaxis.set_ticks_position( 'left' ) ax.spines[ 'left' ].set_position(( 'data' , 0 )) X = np.linspace( - np.pi, np.pi, 256 ,endpoint = True ) C,S = np.cos(X), np.sin(X) plt.plot(X, C, color = "blue" , linewidth = 2.5 , linestyle = "-" ) plt.plot(X, S, color = "red" , linewidth = 2.5 , linestyle = "-" ) plt.xlim(X. min () * 1.1 , X. max () * 1.1 ) plt.xticks([ - np.pi, - np.pi / 2 , 0 , np.pi / 2 , np.pi], [r '$-\pi$' , r '$-\pi/2$' , r '$0$' , r '$+\pi/2$' , r '$+\pi$' ]) plt.ylim(C. min () * 1.1 ,C. max () * 1.1 ) plt.yticks([ - 1 , 0 , + 1 ], [r '$-1$' , r '$0$' , r '$+1$' ]) plt.show() |
顯示的結果就是:
圖例和注解
圖例十分簡單,下述代碼就可以解決:
1
2
3
|
plot(X, C, color = "blue" , linewidth = 2.5 , linestyle = "-" , label = "cosine" ) plot(X, S, color = "red" , linewidth = 2.5 , linestyle = "-" , label = "sine" ) legend(loc = 'upper left' ) |
在plot里指定label屬性就好了,最后調用下legend函數來確定圖例的位置,一般就是'upper left'就好了。
注解就有點麻煩了,要用到annotate命令,挺復雜的,暫時是在不想看,姑且貼一段完整的代碼和效果圖吧:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
# ----------------------------------------------------------------------------- # Copyright (c) 2015, Nicolas P. Rougier. All Rights Reserved. # Distributed under the (new) BSD License. See LICENSE.txt for more info. # ----------------------------------------------------------------------------- import numpy as np import matplotlib.pyplot as plt plt.figure(figsize = ( 8 , 5 ), dpi = 80 ) ax = plt.subplot( 111 ) ax.spines[ 'right' ].set_color( 'none' ) ax.spines[ 'top' ].set_color( 'none' ) ax.xaxis.set_ticks_position( 'bottom' ) ax.spines[ 'bottom' ].set_position(( 'data' , 0 )) ax.yaxis.set_ticks_position( 'left' ) ax.spines[ 'left' ].set_position(( 'data' , 0 )) X = np.linspace( - np.pi, np.pi, 256 ,endpoint = True ) C,S = np.cos(X), np.sin(X) plt.plot(X, C, color = "blue" , linewidth = 2.5 , linestyle = "-" , label = "cosine" ) plt.plot(X, S, color = "red" , linewidth = 2.5 , linestyle = "-" , label = "sine" ) plt.xlim(X. min () * 1.1 , X. max () * 1.1 ) plt.xticks([ - np.pi, - np.pi / 2 , 0 , np.pi / 2 , np.pi], [r '$-\pi$' , r '$-\pi/2$' , r '$0$' , r '$+\pi/2$' , r '$+\pi$' ]) plt.ylim(C. min () * 1.1 ,C. max () * 1.1 ) plt.yticks([ - 1 , + 1 ], [r '$-1$' , r '$+1$' ]) t = 2 * np.pi / 3 plt.plot([t,t],[ 0 ,np.cos(t)], color = 'blue' , linewidth = 1.5 , linestyle = "--" ) plt.scatter([t,],[np.cos(t),], 50 , color = 'blue' ) plt.annotate(r '$\sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$' , xy = (t, np.sin(t)), xycoords = 'data' , xytext = ( + 10 , + 30 ), textcoords = 'offset points' , fontsize = 16 , arrowprops = dict (arrowstyle = "->" , connectionstyle = "arc3,rad=.2" )) plt.plot([t,t],[ 0 ,np.sin(t)], color = 'red' , linewidth = 1.5 , linestyle = "--" ) plt.scatter([t,],[np.sin(t),], 50 , color = 'red' ) plt.annotate(r '$\cos(\frac{2\pi}{3})=-\frac{1}{2}$' , xy = (t, np.cos(t)), xycoords = 'data' , xytext = ( - 90 , - 50 ), textcoords = 'offset points' , fontsize = 16 , arrowprops = dict (arrowstyle = "->" , connectionstyle = "arc3,rad=.2" )) plt.legend(loc = 'upper left' , frameon = False ) plt.savefig( "../figures/exercice_9.png" ,dpi = 72 ) plt.show() |
效果圖:
還是十分高能的。。。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家學習或者使用python能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:https://blog.mythsman.com/2016/01/23/2/