這篇文章主要給大家介紹了利用numpy+matplotlib繪圖的基本操作,文中介紹的非常詳細,對大家學習matplotlib繪圖具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧。
簡述
Matplotlib是一個基於python的2D畫圖庫,能夠用python指令碼方便的畫出折線圖,長條圖,功率譜圖,散佈圖等常用圖表,而且文法簡單。具體介紹見matplot官網。
Numpy(Numeric Python)是一個模仿matlab的對python數值運算進行的擴充,提供了許多進階的數值編程工具,如:矩陣資料類型、向量處理,以及精密的運算庫。專為進行嚴格的數文書處理而產生,而且據說自從他出現了以後,NASA就把很多原來用fortran和matlab做的工作交給了numpy來做了,可見其強大。。。他的官網在這裡,具體的資料都在裡面。
安裝
$sudo apt-get install python-matplotlib$sudo apt-get install python-numpy
(牛力大法好~)
使用
matplotlib可以在指令碼中使用,不過如果在ipython中使用則會更加炫(直接添加–pylab參數可以免去導包的過程),而且能得到類似Matlab/Mathematica一樣的功能,即時輸入,即時輸出。個人覺得說白了他就是模仿Matlab/Mathematica的,但是的確比前者更加方便編程。
很多情況下matplot需要配合numpy包一起用,關於numpy包我不打算分開來說,用到的時候提一下就行。有一點需要注意的是,numpy包通常是這樣匯入的:
import numpy as np
會給他起一個叫np的別名,而且這幾乎已經是約定俗成了。
在python或者ipython中輸入help(*需要尋找的函數*) 就行(當然需要先匯入下包)。
第一個映像
需要匯入的包:
import numpy as npfrom pylab import *
第一個函數映像
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:
figure(figsize=(8,6), dpi=80)
這裡參數的順序沒有要求,但是一定要加上參數名,因為他是根據參數名來區別每個參數的,是一種跟C語言類型不同的函數。figsize參數表示figure的寬高比,然後dpi表示每一份占的長度,比如這裡就表示映像是640x480的。
輸出命令之後會立刻出現一個視窗,接下來所有的plot命令都會立刻顯示在這個視窗上而不用再輸入show命令了。
一個figure裡也能顯示多個圖表,我們可以用如下函數來分割一個figure:
subplot(3,4,6)
這樣就會把當前的figure分割成3行4列的表,而啟用其中的第6張,即第2行第3張。以後的plot都是在這一個子表上產生的,如果需要更換則可以重新輸入subplot命令來確定其新的位置。
除此之外,如果我們對圖表顯示的範圍不滿意,我們還可以直接調整圖表的座標範圍:
xlim(-4.0,4.0)ylim(-1.0,1.0)
這就表示x軸的範圍設定在-4到4,y軸的範圍設定在-1到1。當然,如果是想相對的進行修改我們可以利用下numpy數組的min和max方法。比如X.min()
這樣的東西。
如果對座標顯示的密度啊什麼的不滿意,我們也可以調節他的標註點:
xticks(np.linspace(-4,4,9,endpoint=True))yticks(np.linspace(-1,1,5,endpoint=True))
對於xticks和yticks,我們實際上可以傳入任意的數組,這裡不過是為了方便而用numpy快速產生的等差數列。
當然,我們也可以給標註點進行任意的命名,像下面這樣:
xticks([1,2,3,4,5],['one','two','three','four','five'])
效果也很好想象,就不貼圖了。需要注意的是這裡也可以支援LaTex文法,將LaTex引用在兩個$之間就可以了。(關於LaTex)
這裡也有個小竅門,就是如果想不顯示標註的話,我們就可以直接給xticks賦一個空的數組。
更改色彩和線寬
我們可以在畫plot的時候用如下方法指定他的顏色和線寬:
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的大小
這樣就基本上能夠自訂任何的折線圖、散佈圖的樣式了。
移動軸線
這段有點小複雜,暫時不想具體瞭解奇奇怪怪的函數調用,姑且先記錄下用法和原理:
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的地方。這樣我們就能根據自己想要位置來調節軸線了。
比如下面這段官方的代碼:
# -----------------------------------------------------------------------------# Copyright (c) 2015, Nicolas P. Rougier. All Rights Reserved.# Distributed under the (new) BSD License. See LICENSE.txt for more info.# -----------------------------------------------------------------------------import numpy as npimport matplotlib.pyplot as pltplt.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()
顯示的結果就是:
圖例和註解
圖例十分簡單,下述代碼就可以解決:
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命令,挺複雜的,暫時是在不想看,姑且貼一段完整的代碼和吧:
# -----------------------------------------------------------------------------# Copyright (c) 2015, Nicolas P. Rougier. All Rights Reserved.# Distributed under the (new) BSD License. See LICENSE.txt for more info.# -----------------------------------------------------------------------------import numpy as npimport matplotlib.pyplot as pltplt.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/3plt.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()
:
還是十分高能的。。。
總結
【相關推薦】
1. Python免費視頻教程
2. Python基礎入門教程
3. Python在資料科學中的應用