-----------------------------------------------------------Matplotlib:繪圖和可視化------------------------------------------------------------------------------
Matplotlib:---------------------------------------------------是一個強大的Python繪圖和數據可視化的工具包
一:安裝方法:------------------------------------------------pip install matplotlib
二:引用方法:------------------------------------------------import matplotlib.pyplot as plt
三:使用:
1:繪圖函數:---------------------------------------------plt.plot()
2:顯示函數------------------------------------------------plt.show()
3:plot函數:繪制折線圖
----線型:------------------------------------------------(-,-.,--,..,-.,......等)
----點型:------------------------------------------------marker(v,^,s,*,H,+,X,D,o,......等)
----顏色:------------------------------------------------color(b,g,r,y,k,w,......等)
plot函數繪制多條曲線
pands包對plot的支持
4:Matplotlip:圖像標注
----設置圖像標題:----------------------------------------plt.title()
----設置x軸名稱:-----------------------------------------plt.xlabel()
----設置y軸名稱:-----------------------------------------plt.ylabel()
----設置x軸范圍:-----------------------------------------plt.xlim()
----設置y軸名稱:-----------------------------------------plt.ylim()
----設置x軸刻度:-----------------------------------------plt.xticks()
----設置y軸刻度:-----------------------------------------plt.yticks()
----設置曲線圖例:-----------------------------------------plt.legend()
5:Matplotlib:畫布與子圖
----畫布--------------------------------------------------figure
fig = plt.figure()
----圖:--------------------------------------------------subplot
ax1 = fig.add subplot(2,2,1)
----調節子圖間距:----------------------------------------subplots_adjust(left, bottom, right, top, wspace, hspace)
6:Matplotlib-支持的圖類型
坐標圖:--------------------------------------------------plt.plot(x,y,fmt,...)
箱型圖:--------------------------------------------------plt.boxplot(data, notch, position)
條形圖:--------------------------------------------------plt.bar(left,height,width,bottom)
橫向條形圖:----------------------------------------------plt.barh(width,bottom,left,height)
極坐標圖:------------------------------------------------plt.polar(theta, r)
餅圖:----------------------------------------------------plt.pie(data, explode)
功率譜密度圖:--------------------------------------------plt.psd(x,NFFT=256,pad_to,Fs)
譜圖:----------------------------------------------------plt.specgram(x,NFFT=256,pad_to,F)
X-Y相關性函數:-------------------------------------------plt.cohere(x,y,NFFT=256,Fs)
散點圖:--------------------------------------------------plt.scatter(x,y)
步階圖:--------------------------------------------------plt.step(x,y,where)
直方圖:--------------------------------------------------plt.hist(x,bins,normed)
7:Matplotlib——繪制K線圖
matplotlib.finanace子包中有許多繪制金融相關圖的函數接口。
繪制K線圖:matplotlib.finance.candlestick_ochl函數
實例:
1:
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.show()
運行結果
你可能會很疑惑X和Y軸為什么是0~3和1~4。原因是這樣的,這里我們只是為plot()命令提供 了一個list或者是array,matplotlib就會假設這個序列是Y軸上的取值,並且會自動為你生成X軸上的值。因為python中的范圍是從0開始的,因此X軸就是從0開始,長度與Y的長度相同,也就是[0,1,2,3]。
plot()是一個靈活的命令,它的參數可以是任意數量,比如:
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
- 1
這表示的是(x,y)對,(1,1)(2,4)(3,9)(4,16)。這里有第三個可選參數,它是字符串格式的,表示顏色和線的類型。該字符串格式中的字母和符號來自於MATLAB,它是顏色字符串和線的類型字符串的組合。默認情況下,該字符串參數是’b-‘,表示藍色的實線。
舉一個使用紅色圓圈繪制上述點集的例子:
import matplotlib.pyplot as plt plt.plot([1,2,3,4], [1,4,9,16], 'ro') plt.axis([0, 6, 0, 20]) plt.show()
可以查看plot()的文檔,那里有完整的關於線的類型的說明。axis()命令可以方便的獲取和設置XY軸的一些屬性。
如果matplotlib僅限於使用上面那種list,那么它將顯得毫無用處。通常,我們都是使用numpy數組,實際上,所有的序列都將被在內部被轉化成numpy數字。下面的例子是使用一個命令用幾種不同風格的線繪制一個數組:
import numpy as np import matplotlib.pyplot as plt # 0到5之間每隔0.2取一個數 t = np.arange(0., 5., 0.2) # 紅色的破折號,藍色的方塊,綠色的三角形 plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^') plt.show()
-
控制線的屬性
線有許多屬性可以設置:線寬、線的形狀,平滑等等。這里有一些設置線屬性的方法:- 使用關鍵字參數
plt.plot(x,y,linewidth=2.0)
- 1
- 對線對象(Line2D)使用set_方法,plot()會返回一個線對象的列表,比如line1, line2 = plot(x1, y1, x2, y2)。下面的代碼我們將假設我們只有一條線,即返回的線對象列表的長度為1。
line, = plt.plot(x, y, '-') line.set_antialiased(False) # 關閉平滑
- 1
- 2
- 使用setp()命令。 下面的例子使用的是MATLAB風格的命令去設置一個線的列表的多個屬性。setp()可以作用於一個列表對象或者是一個單一的對象。你可以使用python風格的關鍵字參數或者是MATLAB風格的string/value對為參數:
lines = plt.plot(x1, y1, x2, y2) # 使用關鍵字 plt.setp(lines, color='r', linewidth=2.0) # 或者是MATLAB風格的string/value對 plt.setp(lines, 'color', 'r', 'linewidth', 2.0)
-
這是一些Line2D的屬性和取值:
-
工作在多圖形(figures)和多坐標系(axes)
MATLAB和pyplot都有當前圖形(figure)和當前坐標系(axes)的概念。所有的繪圖命令都是應用於當前坐標系的。gca()和gcf()(get current axes/figures)分別獲取當前axes和figures的對象。通常,你不用擔心這些,因為他們都在幕后被保存了,下面是一個例子,創建了兩個子繪圖區域(subplot):import numpy as np import matplotlib.pyplot as plt def f(t): return np.exp(-t) * np.cos(2*np.pi*t) t1 = np.arange(0.0, 5.0, 0.1) t2 = np.arange(0.0, 5.0, 0.02) plt.figure("2subplot") plt.subplot(211) plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k') plt.subplot(212) plt.plot(t2, np.cos(2*np.pi*t2), 'r--') plt.show()
-
figure()命令在這兒可以不寫,因為figure(1)將會被默認執行,同樣,subplot(111)也是默認被執行的。subplot()中的參數分別指定了numrows、numcols、fignum,其中fignum的取值范圍為1到numrows*numcols,分別表示的是將繪圖區域划分為numrows行和numcols列個子繪圖區域,fignum為當前子圖的編號。編號是從1開始,一行一行由左向右編號的。其實subplot中的參數【111】本應寫作【1,1,1】,但是如果這三個參數都小於10(其實就是第三個參數小於10)就可以省略逗號。你可以創建任意數量的子圖(subplots)和坐標系(axes)。如果你想手動放置一個axes,也就是它不再是一個矩形方格,你就可以使用命令axes(),它可以讓坐標系位於任何位置,axes([left,bottom,width,height]),其中所有的值都是0到1(axes([0.3,0.4,0.2,0.3])表示的是該坐標系位於figure的(0.3,0.4)處,其寬度和長度分別為figure橫坐標和縱坐標總長的0.2和0.3)。其實subplot和axes的區別就在於axes大小和位置更加隨意。
你可以創建多個figure,通過調用figure(),其參數為figure的編號。當然每個figure可以包含多個subplot或者是多個axes。例子:import matplotlib.pyplot as plt plt.figure(1) # 編號為1的figure plt.subplot(211) # figure1中的第一個子圖 plt.plot([1, 2, 3]) plt.subplot(212) # figure1中的第二個子圖 plt.plot([4, 5, 6]) plt.figure(2) # figure2 plt.plot([4, 5, 6]) # 默認使用subplot(111),此時figure2為當 # 前figure plt.figure(1) # 設置figure1為當前figure; # 但是subplot(212)為當前子圖 plt.subplot(211) # 使subplot(211)為當前子圖 plt.title('Easy as 1, 2, 3') # 對subplot(211)命名
-
我們可以使用clf()和cla()(clear current figure/axes)清除當前figure和當前axes。
如果你創建了許多figures,你需要注意一件事:figure的內存直到顯示調用close()函數才會被完全釋放,否則它並沒有被全部釋放。如果只是刪掉對figure的引用,或者是通過關閉window進程管理器關閉該figure,這都是不完全刪除figure的,因為pyplot在內部維持了一個引用,直到close()被調用。 -
文字
text()命令可以被用來在任何位置添加文字,xlabel()、ylabel()、title()被用來在指定位置添加文字。import numpy as np import matplotlib.pyplot as plt mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) # 直方圖 n, bins, patches = plt.hist(x, 50, normed=1, facecolor='g', alpha=0.75) plt.xlabel('Smarts') plt.ylabel('Probability') plt.title('Histogram of IQ') plt.text(60, .025, r'$\mu=100,\ \sigma=15$') plt.axis([40, 160, 0, 0.03]) plt.grid(True) plt.show()
-
所有text()命令返回一個matplotlib.text.Text實例,像上面的線一樣,可以通過關鍵字參數在text()定制文本樣式,也可以通過setp()來定制文字的樣式:t = plt.xlabel('my data', fontsize=14, color='red') setp(t,color='blue')
- 1
- 2
- 在文本中使用數學表達式
matplotlib接受任何TeX方程表達式,比如,你可以寫成用”$”符號包裹的TeX表達式:
plt.title(r'$\sigma_i=15$')
- 1
這里的”r”非常重要,它表示后面的字符串是一個純粹的字符串,不會將后面的反斜杠當作轉義字符。matplotlib內置有TeX表達式解釋器和排版引擎,和自帶的數學字體。因此你可以不用安裝TeX就能使用數學表達式,如果你安裝了LaTeX和dvipng,你也可以使用LaTex排版你的文字並且直接輸出到figures或者是保存。
- 注釋文本
使用text()命令可以在Axes中任意位置放置文本,一個普遍的文本用法是對一些特性進行注釋,annotate()方法讓添加注釋變得很容易。對於注釋有兩點需要注意:需要被注釋的地方,使用xy參數來指出,還有就是注釋文本所放置的位置,使用參數xytext來指定位置,這兩個參數都使(x,y)元組:
import numpy as np import matplotlib.pyplot as plt ax = plt.subplot(111) t = np.arange(0.0, 5.0, 0.01) s = np.cos(2*np.pi*t) line, = plt.plot(t, s, lw=2) plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5), arrowprops=dict(facecolor='black', shrink=0.05), ) plt.ylim(-2,2) plt.show()
-
這里的xy和xytext所使用的坐標是根據XY軸的刻度的坐標,稱為data coordinates。當然也可以使用其他坐標系統,具體參考官方文檔。 -
對數和其他非線性坐標軸(axis)
matplotlib.pylot不僅僅提供了線性的坐標,還提供了對數(logarithmic)和分對數(logit)坐標。當數據的維度跨越許多數量級時,這種坐標就很有用,改變坐標軸的刻度很容易:plt.xscale(‘log’)
-
下面是一個例子,對於同樣的數據,在Y軸使用不同刻度下的曲線圖:
import numpy as np import matplotlib.pyplot as plt # 在區間[0,1]制造一些數據 # np.random.normal為高斯分布 y = np.random.normal(loc=0.5, scale=0.4, size=1000) y = y[(y > 0) & (y < 1)] y.sort() x = np.arange(len(y)) # 創建一個窗口 plt.figure(1) # 線性 plt.subplot(221) plt.plot(x, y) plt.yscale('linear') plt.title('linear') plt.grid(True) # 對數 plt.subplot(222) plt.plot(x, y) plt.yscale('log') plt.title('log') plt.grid(True) # symmetric log plt.subplot(223) plt.plot(x, y - y.mean()) plt.yscale('symlog', linthreshy=0.05) plt.title('symlog') plt.grid(True) # logit plt.subplot(224) plt.plot(x, y) plt.yscale('logit') plt.title('logit') plt.grid(True) plt.show()
-
實現一個最簡單的plot函數調用:
1 import matplotlib.pyplot as plt 2 3 y=pp.DS.Transac_open # 設置y軸數據,以數組形式提供 4 5 x=len(y) # 設置x軸,以y軸數組長度為寬度 6 x=range(x) # 以0開始的遞增序列作為x軸數據 7 8 plt.plot(x,y) # 只提供x軸,y軸參數,畫最簡單圖形
圖形輸出結果類似於:
加入新方法:
plt.figure() :自定義畫布大小
plt.subplot() :設置畫布划分以及圖像在畫布上輸出的位置
import matplotlib.pyplot as plt y=pp.DS.Transac_open # 設置y軸數據,以數組形式提供 x=len(y) # 設置x軸,以y軸數組長度為寬度 x=range(x) # 以0開始的遞增序列作為x軸數據 #============================== plt.figure(figsize=(8,8),dpi=80) # 畫圖之前首先設置figure對象,此函數相當於設置一塊自定義大小的畫布,使得后面的圖形輸出在這塊規定了大小的畫布上,其中參數figsize設置畫布大小 plt.subplot(221) # 將figure設置的畫布大小分成幾個部分,參數‘221’表示2(row)x2(colu),即將畫布分成2x2,兩行兩列的4塊區域,1表示選擇圖形輸出的區域在第一塊,圖形輸出區域參數必須在“行x列”范圍 ,此處必須在1和2之間選擇——如果參數設置為subplot(111),則表示畫布整個輸出,不分割成小塊區域,圖形直接輸出在整塊畫布上 plt.plot(y,xx) # 在2x2畫布中第一塊區域輸出圖形 plt.subplot(222) plt.plot(y,xx) #在2x2畫布中第二塊區域輸出圖形 plt.show() plt.subplot(223) #在2x2畫布中第三塊區域輸出圖形 plt.plot(y,xx) plt.subplot(224) # 在在2x2畫布中第四塊區域輸出圖形 plt.plot(y,xx) #============================== plt.plot(x,y) # 只提供x軸,y軸參數,畫最簡單圖形
輸出結果:
加入新方法:
plt.xticks():設置x軸刻度的表現方式
plt.xlim():設置x軸刻度的取值范圍
1 import matplotlib.pyplot as plt 2 import numpy as nu 3 4 y=pp.DS.Transac_open # 設置y軸數據,以數組形式提供 5 6 x=len(y) # 設置x軸,以y軸數組長度為寬度 7 x=range(x) # 以0開始的遞增序列作為x軸數據 8 9 plt.figure(figsize=(8,8),dpi=80) # 畫圖之前首先設置figure對象,此函數相當於設置一塊自定義大小的畫布,使得后面的圖形輸出在這塊規定了大小的畫布上,其中參數figsize設置畫布大小 10 plt.subplot(111) # 將figure設置的畫布大小分成幾個部分,參數‘221’表示2(row)x2(colu),即將畫布分成2x2,兩行兩列的4塊區域,1表示選擇圖形輸出的區域在第一塊,圖形輸出區域參數必須在“行x列”范圍 ,此處必須在1和2之間選擇——如果參數設置為subplot(111),則表示畫布整個輸出,不分割成小塊區域,圖形直接輸出在整塊畫布上 11 plt.plot(y,x) 12 #================================ 13 plt.xlim(0,1000) # 設置x軸刻度范圍,從0~1000 14 plt.ylim(0,20) # 設置y軸刻度的范圍,從0~20 15 16 plt.xticks(nu.linspace(0,1000,15,endpoint=True)) # 設置x軸刻度 17 plt.yticks(nu.linspace(0,20,10,endpoint=True)) # 設置y軸刻度 18 #numpy.linspace()方法返回一個等差數列數組,第一個參數表示等差數列的第一個數,第二個參數表示等差數列最后一個數,第三個參數設置組成等差數列的元素個數,endpoint參數設置最后一個數是否包含在該等差數列。數列中相鄰元素間的步長值為隨機 19 如:nu.linspace(0,1000,15,endpoint=True)表示:第一個元素為0,最后一個數為1000,在這個 范圍內,取15個值,構成一個等差數列,步長值隨機,且1000包含在該數列中 20 #================================ 21 plt.show()
圖形輸出結果:
修改plot方法,新加入參數:
plt.plot(y,xx,color='red',linewidth=2.5,linestyle='-') # color參數設置曲線顏色,linewidth設置曲線寬度,linestyle設置曲線風格
輸出結果: