利用numpy+matplotlib繪圖的基本操作教程
簡(jiǎn)述
Matplotlib是一個(gè)基于python的2D畫(huà)圖庫(kù),能夠用python腳本方便的畫(huà)出折線圖,直方圖,功率譜圖,散點(diǎn)圖等常用圖表,而且語(yǔ)法簡(jiǎn)單。具體介紹見(jiàn)matplot官網(wǎng)。
Numpy(Numeric Python)是一個(gè)模仿matlab的對(duì)python數(shù)值運(yùn)算進(jìn)行的擴(kuò)展,提供了許多高級(jí)的數(shù)值編程工具,如:矩陣數(shù)據(jù)類(lèi)型、矢量處理,以及精密的運(yùn)算庫(kù)。專(zhuān)為進(jìn)行嚴(yán)格的數(shù)字處理而產(chǎn)生,而且據(jù)說(shuō)自從他出現(xiàn)了以后,NASA就把很多原來(lái)用fortran和matlab做的工作交給了numpy來(lái)做了,可見(jiàn)其強(qiáng)大。。。他的官網(wǎng)在這里,具體的資料都在里面。
安裝
$sudo apt-get install python-matplotlib $sudo apt-get install python-numpy
使用
matplotlib可以在腳本中使用,不過(guò)如果在ipython中使用則會(huì)更加炫(直接添加–pylab參數(shù)可以免去導(dǎo)包的過(guò)程),而且能得到類(lèi)似Matlab/Mathematica一樣的功能,即時(shí)輸入,即時(shí)輸出。個(gè)人覺(jué)得說(shuō)白了他就是模仿Matlab/Mathematica的,但是的確比前者更加方便編程。
很多情況下matplot需要配合numpy包一起用,關(guān)于numpy包我不打算分開(kāi)來(lái)說(shuō),用到的時(shí)候提一下就行。有一點(diǎn)需要注意的是,numpy包通常是這樣導(dǎo)入的:
import numpy as np
會(huì)給他起一個(gè)叫np的別名,而且這幾乎已經(jīng)是約定俗成了。
在python或者ipython中輸入help(*需要查找的函數(shù)*) 就行(當(dāng)然需要先導(dǎo)入下包)。
第一個(gè)圖像
需要導(dǎo)入的包:
import numpy as np from pylab import *
第一個(gè)函數(shù)圖像
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基礎(chǔ)的同學(xué)肯定不陌生。。。是的,這兩個(gè)模塊的組合幾乎就跟matlab的用法無(wú)二。。
1、首先用np.linspace
方法生成一個(gè)數(shù)組X,這個(gè)數(shù)組是從$-\pi$
開(kāi)始到$\pi$
的總共包含256個(gè)元素的數(shù)組,endpoint參數(shù)表示是否包含首尾端點(diǎn)(他的值是True或False,首字母要大寫(xiě)。。。。)。當(dāng)然,這個(gè)數(shù)組就是一個(gè)普通的數(shù)組了,跟其他數(shù)組沒(méi)有區(qū)別。
2、然后用np.cos()
和np.sin()
方法作用在X數(shù)組上,對(duì)于X中的每一個(gè)元素進(jìn)行計(jì)算,生成結(jié)果數(shù)組。(免去了迭代的過(guò)程)。
3、接著調(diào)用pylab的plot方法,第一個(gè)參數(shù)是橫坐標(biāo)數(shù)組,第二個(gè)參數(shù)是縱坐標(biāo)數(shù)組,其他參數(shù)暫且不談。這樣他會(huì)生成一個(gè)默認(rèn)的圖表了。(不會(huì)立刻顯示)
4、當(dāng)然,最后還要調(diào)用show方法來(lái)顯示圖表。
5、結(jié)果:
圖表的名字叫figure1,左下面有幾個(gè)按鈕,都是很實(shí)用的東西,右下角會(huì)顯示當(dāng)前鼠標(biāo)左邊,也很方便。
圖表布局和坐標(biāo)分布
每一個(gè)圖表都是在一個(gè)figure里面,我們可以通過(guò)如下命令生成一個(gè)空的figure:
figure(figsize=(8,6), dpi=80)
這里參數(shù)的順序沒(méi)有要求,但是一定要加上參數(shù)名,因?yàn)樗歉鶕?jù)參數(shù)名來(lái)區(qū)別每個(gè)參數(shù)的,是一種跟C語(yǔ)言類(lèi)型不同的函數(shù)。figsize參數(shù)表示figure的寬高比,然后dpi表示每一份占的長(zhǎng)度,比如這里就表示圖像是640x480的。
輸出命令之后會(huì)立刻出現(xiàn)一個(gè)窗口,接下來(lái)所有的plot命令都會(huì)立刻顯示在這個(gè)窗口上而不用再輸入show命令了。
一個(gè)figure里也能顯示多個(gè)圖表,我們可以用如下函數(shù)來(lái)分割一個(gè)figure:
subplot(3,4,6)
這樣就會(huì)把當(dāng)前的figure分割成3行4列的表,而激活其中的第6張,即第2行第3張。以后的plot都是在這一個(gè)子表上生成的,如果需要更換則可以重新輸入subplot命令來(lái)確定其新的位置。
除此之外,如果我們對(duì)圖表顯示的范圍不滿意,我們還可以直接調(diào)整圖表的坐標(biāo)范圍:
xlim(-4.0,4.0) ylim(-1.0,1.0)
這就表示x軸的范圍設(shè)置在-4到4,y軸的范圍設(shè)置在-1到1。當(dāng)然,如果是想相對(duì)的進(jìn)行修改我們可以利用下numpy數(shù)組的min和max方法。比如X.min()
這樣的東西。
如果對(duì)坐標(biāo)顯示的密度啊什么的不滿意,我們也可以調(diào)節(jié)他的標(biāo)注點(diǎn):
xticks(np.linspace(-4,4,9,endpoint=True)) yticks(np.linspace(-1,1,5,endpoint=True))
對(duì)于xticks和yticks,我們實(shí)際上可以傳入任意的數(shù)組,這里不過(guò)是為了方便而用numpy快速生成的等差數(shù)列。
當(dāng)然,我們也可以給標(biāo)注點(diǎn)進(jìn)行任意的命名,像下面這樣:
xticks([1,2,3,4,5],['one','two','three','four','five'])
效果也很好想象,就不貼圖了。需要注意的是這里也可以支持LaTex語(yǔ)法,將LaTex引用在兩個(gè)$之間就可以了。(關(guān)于LaTex)
這里也有個(gè)小竅門(mén),就是如果想不顯示標(biāo)注的話,我們就可以直接給xticks賦一個(gè)空的數(shù)組。
更改色彩和線寬
我們可以在畫(huà)plot的時(shí)候用如下方法指定他的顏色和線寬:
plot(X, C, color='#cadae3', linestyle='-',linewidth=1.3, marker='o', markerfacecolor='blue', markersize=12,)
同樣,這里參數(shù)的順序不重要,名字才重要。
color參數(shù)可以指定RGB的色相,也可以用一些默認(rèn)的名字,比如red blue之類(lèi)的。
linestyle參數(shù)則指定了線的樣式,具體參照以下樣式:
參數(shù) | 樣式 |
---|---|
‘-‘ | 實(shí)線 |
‘–’ | 虛線 |
‘-.’ | 線-點(diǎn) |
‘:’ | 點(diǎn)虛線 |
linewidth參數(shù)指定折線的寬度,是個(gè)浮點(diǎn)數(shù)。
marker參數(shù)指定散點(diǎn)的樣式,具體參照以下樣式:
參數(shù) | 樣式 |
---|---|
‘.’ | 實(shí)心點(diǎn) |
‘o’ | 圓圈 |
‘,’ | 一個(gè)像素點(diǎn) |
‘x’ | 叉號(hào) |
‘+’ | 十字 |
‘*’ | 星號(hào) |
‘^’ ‘v’ ‘<’ ‘>’ | 三角形(上下左右) |
‘1’ ‘2’ ‘3’ ‘4’ | 三叉號(hào)(上下左右) |
markerfacecolor參數(shù)指定marker的顏色
markersize參數(shù)指定marker的大小
這樣就基本上能夠自定義任何的折線圖、散點(diǎn)圖的樣式了。
移動(dòng)軸線
這段有點(diǎn)小復(fù)雜,暫時(shí)不想具體了解奇奇怪怪的函數(shù)調(diào)用,姑且先記錄下用法和原理:
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))
我們知道一張圖有上下左右四個(gè)軸線,這里我們把右邊和上邊的軸線顏色調(diào)為透明,然后把下邊設(shè)置到y(tǒng)軸數(shù)據(jù)為0的地方,把左邊設(shè)置到x軸數(shù)據(jù)為0的地方。這樣我們就能根據(jù)自己想要位置來(lái)調(diào)節(jié)軸線了。
比如下面這段官方的代碼:
# ----------------------------------------------------------------------------- # 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()
顯示的結(jié)果就是:
圖例和注解
圖例十分簡(jiǎn)單,下述代碼就可以解決:
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屬性就好了,最后調(diào)用下legend函數(shù)來(lái)確定圖例的位置,一般就是’upper left’就好了。
注解就有點(diǎn)麻煩了,要用到annotate命令,挺復(fù)雜的,暫時(shí)是在不想看,姑且貼一段完整的代碼和效果圖吧:
# ----------------------------------------------------------------------------- # 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()
效果圖:
還是十分高能的。。。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)或者使用python能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Python 一鍵獲取百度網(wǎng)盤(pán)提取碼的方法
這篇文章主要介紹了Python 一鍵獲取百度網(wǎng)盤(pán)提取碼的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08python爬蟲(chóng)通過(guò)增加多線程獲取數(shù)據(jù)
這篇文章主要為大家介紹了python爬蟲(chóng)通過(guò)增加多線程獲取數(shù)據(jù)實(shí)現(xiàn)過(guò)程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06python 實(shí)現(xiàn)二維列表轉(zhuǎn)置
今天小編就為大家分享一篇python 實(shí)現(xiàn)二維列表轉(zhuǎn)置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Python爬取國(guó)外天氣預(yù)報(bào)網(wǎng)站的方法
這篇文章主要介紹了Python爬取國(guó)外天氣預(yù)報(bào)網(wǎng)站的方法,可實(shí)現(xiàn)抓取國(guó)外天氣預(yù)報(bào)信息的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07Python學(xué)習(xí)開(kāi)發(fā)之圖形用戶界面詳解
當(dāng)前流行的計(jì)算機(jī)桌面應(yīng)用程序大多數(shù)為圖形化用戶界面(Graphic User Interface,GUI),python也提供了多個(gè)圖形開(kāi)發(fā)界面的庫(kù),這篇文章主要給大家介紹了關(guān)于Python學(xué)習(xí)開(kāi)發(fā)之圖形用戶界面的相關(guān)資料,需要的朋友可以參考下2021-08-08