Matplotlib隨記1
Matplotlib概況
在我們進行機器學習分析的時候,通常需要將我們所需要的結果進行圖像化表示出來,以方便我們可以更加形象的看到數據變化大趨勢。在我進行尋找相應的工具時,我發現了Matplotlib是一個相當好的工具,主要是因為Matplotlib有很強大的功能,它可以為我們匯出各種美麗的圖形,比如線圖,散點圖,等高線圖,條形圖,柱狀圖,3D圖形,甚至是動畫圖像等等,我們可以根據自己的需求繪出自己所需要的圖形。比如說,以下幾個圖形就是我們通過Matplotlib進行繪制的
Matplotlib安裝
俗話說,“工欲善其事必先利其器”,在學習matplotlib之前,必先安裝好matplotlib相關環境,我用的是ubuntu16.04系統,安裝相對比較簡單。打開控制臺窗口,在窗口中輸入:
#python 3+ 請使用以下代碼 $ sudo apt-get install python3-matplotlib #python 2+ 請使用以下代碼 $ sudo apt-get install python-matplotlib
在安裝好matplotlib之後,我們就可以盡興的翺翔在matplotlib的海洋裏面了
matplotlib基本用法
首先我們要使用import 導入matplotlib,在使用matplotlib時,我們通常不需要導入matplotlib整個模塊,而是只需導入matplotlib中的pyplot這一個模塊即可,並簡寫成plt;使用import 導入模塊numpy,並簡寫成np
import matplotlib.pyplot as plt import numpy as np
使用np.linspace定義x:範圍是(-1,1);個數是50,仿真一位數據組(x,y)表示曲線1
x=np.linspace(-1,1,50)
y=2*x + 1
使用plt.figure定義一個圖像窗口,使用plt.plot畫(x,y)曲線。使用plt.show顯示圖像
plt.figure()
plt.plot(x,y)
plt.show()
完整代碼如下:
import matplotlib.pyplot as plt import numpy as np x=np.linspace(-1,1,50) y=2*x + 1 plt.figure() plt.plot(x,y) plt.show()
繪成的圖像如下:
figure線條
在上面的基礎上,使用plt.figure()定義一個圖像窗口:編號為3;大小為(8,5)。使用plt.plot畫(x,y2)曲線。使用plt.plot畫(x,y1)曲線,曲線的顏色屬性(color)為紅色;曲線的寬度(linewidth)為1.0;曲線的類型(linestyle)為虛線。使用plt.show顯示圖像
plt.figure(num=3,figsize=(8,5),) plt.plot(x,y2) plt.plot(x,y1,color=‘red‘,linewidth=1.0,linestyle=‘--‘)
完成代碼為:
import matplotlib.pyplot as plt import numpy as np x=np.linspace(-3,3,50) y1=2*x +1 y2=x**2 plt.figure() plt.plot(x,y1) plt.figure(num=3,figsize=(8,5),) plt.plot(x,y2) plt.plot(x,y1,color=‘red‘,linewidth=1.0,linestyle=‘--‘) plt.show()
其產生的圖像為:
設置坐標軸
下面主要是介紹如何在matplotlib中如何設置坐標軸的範圍,單位長度,替代文字等等
使用plt.figure定義一個圖像窗口,使用plt.plot畫(x,y2)曲線。使用plt.plot畫(x,y1)曲線,曲線的顏色屬性(color)為紅色;曲線的寬度(linewidth)為1.0;曲線的類型(linestyle)為虛線
plt.figure() plt.plot(x,y2) plt.plot(x,y1,color=‘red‘,linewidth=1.0,linestyle=‘--‘)
使用plt.xlim設置x坐標軸範圍:(-1,2);使用plt.ylim設置y坐標軸範圍:(-2,3);使用plt.xlable設置x坐標軸名稱:‘I am X‘;使用plt.ylabel設置y坐標軸名稱:‘I am y‘;
plt.xlim((-1,2)) plt.ylim((-2,3)) plt.xlabel(‘I am x‘) plt.ylabel(‘I am y‘)
使用np.linspace定義範圍及個數:範圍是(-1,2);個數是5.使用print函數打印出新定義的範圍。使用plt.xticks設置x軸刻度:範圍是(-1,2);個數是5
new_ticks=np.linspace(-1,2,5) print(new_ticks) plt.xticks(new_ticks)
使用plt.yticks設置y軸刻度以及名稱:刻度為[-2,-1.8,-1,1.22,3];對應刻度的名稱為[‘really bad‘,‘bad‘,‘normal‘,‘good‘,‘really good‘].使用plt,show顯示圖像。
plt.yticks([-2,-1.8,-1,1.22,3],[r‘$really\ bad$‘,r‘$bad$‘,r‘$normal$‘,r‘$good$‘,r‘$eally\ good$‘])
使用plt.gca獲取當前坐標軸的信息。使用.spines設置邊框:右側邊框;使用.set_color設置邊框顏色:默認白色;使用.spines設置邊框:上邊框;使用.set_color設置邊框顏色:默認白色;
ax=plt.gca() ax.spines[‘right‘].set_color(‘none‘) ax.spines[‘top‘].set_color(‘none‘)
下一步我們調整坐標軸。使用.xaxis.set_ticks_position設置x坐標刻度數字或名稱的位置:bottom(所有位置:top,bottom,both,default,none)
ax.xaxis.set_ticks_position(‘bottom‘)
使用.spines設置邊框:x軸;使用.set_position設置邊框位置:y=0的位置;(位置所有屬性:outward,axes,data)
ax.spines[‘bottom‘].set_position((‘data‘,0))
使用.yaxis.set_ticks_position設置y坐標刻度數字或者名稱的位置:left(所有位置:left,right,both,default,none)
ax.yaxis.set_ticks_position(‘left‘)
使用.spines設置邊框:y軸;使用.set_position設置邊框位置:x=0的位置;(位置所有屬性:outward,axes,data) 使用plt.show顯示圖像
ax.spines[‘left‘].set_position((‘data‘,0)) plt.show()
全部代碼如下:
import matplotlib.pyplot as plt import numpy as np x=np.linspace(-3,3,50) y1=2*x + 1 y2=x**2 plt.figure() plt.plot(x,y2) plt.plot(x,y1,color=‘red‘,linewidth=1.0,linestyle=‘--‘) plt.xlim((-1,2)) plt.ylim((-2,3)) plt.xlabel(‘I am x‘) plt.ylabel(‘I am y‘) new_ticks=np.linspace(-1,2,5) print(new_ticks) plt.xticks(new_ticks) plt.yticks([-2,-1.8,-1,1.22,3],[r‘$really\ bad$‘,r‘$bad$‘,r‘$normal$‘,r‘$good$‘,r‘$eally\ good$‘]) ax=plt.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)) plt.show()
結果如下:
legend 圖例
在matplotlib中,我們通常使用其中的legend圖例來幫助我們展示每個數據對應的圖像名稱,從而更好的讓讀者認識你的數據結構
在這裏,我們對圖中的兩條線進行繪制,首先我們設置兩條線的類型信息(藍色實線和紅色虛線)
l1,=plt.plot(x,y2,label=‘linear line‘) l2,=plt.plot(x,y1,color=‘red‘,lineWidth=1.0,linestyle=‘--‘,label=‘square line‘)
legend將要顯示的信息來自於上面代碼中的label,所以我們只需要簡單寫一下代碼,plt就能自動的為我們添加圖例
plt.legend(loc=‘upper right‘)
其中,參數 loc=‘upper right‘ 表示圖例將添加在圖中的右上角
但是,有時候我們想調整圖例的位置和名稱,比如如果我們想單獨修改之前的label信息,給不同類型的線條設置圖例信息,我們可以在plt.legend中輸入更多的參數。如果以以下這種形式添加legend,我們需要確保,在上面的代碼plt.plot(x,y2,label=‘linear line‘)和plt.plot(‘x,y1,label=‘‘square line‘)中有用變量l1,l2分別存儲起來。而且我們需要註意的是l1,l2要以逗號結尾,因為我們需要確保plt.plot()返回的是一個列表。
plt.legend(handles=[l1,l2],labels=[‘up‘,‘down‘],loc=‘best‘)
這樣我們就能分別重新設置線條對應的label了
其中,‘loc‘參數有很多,‘best‘表示自動分配最佳位置,其余的如下:
‘best’:0, ‘upper right‘ : 1, ‘upper left‘ : 2, ‘lower left‘ : 3, ‘lower right‘ : 4, ‘right‘ : 5, ‘center left‘ : 6, ‘center right‘ : 7, ‘lower center‘ : 8, ‘upper center‘ : 9, ‘center‘ : 10,
這部分的完整代碼如下:
import matplotlib.pyplot as plt import numpy as np x=np.linspace(-3,3,50) y1=2*x + 1 y2=x**2 plt.figure() plt.xlim((-1,2)) plt.ylim((-2,3)) new_ticks=np.linspace(-1,2,5) print(new_ticks) plt.xticks(new_ticks) plt.yticks([-2,-1.8,-1,1.22,3],[r‘$really\ bad$‘,r‘$bad$‘,r‘$normal$‘,r‘$good$‘,r‘$eally\ good$‘]) l1,=plt.plot(x,y2,label=‘linear line‘) l2,=plt.plot(x,y1,color=‘red‘,lineWidth=1.0,linestyle=‘--‘,label=‘square line‘) #plt.legend(loc=‘upper right‘) plt.legend(handles=[l1,l2],labels=[‘up‘,‘down‘],loc=‘best‘) plt.show()
所產生的圖像如下:
Annotation標註
在我們畫圖形需要對某些特殊地方進行標註時,我們可以使用annotation.matplotlib中的annotation中的兩種方法,一種是plt裏面的annotate,另外一種直接用plt裏面的text來寫標註
首先,我們繪制一條直線
import matplotlib.pyplot as plt import numpy as np x=np.linspace(-3,3,50) y=2*x + 1 plt.figure(num=1,figsize=(8,5),) plt.plot(x,y,)
之後,我們再移動坐標軸的位置
ax=plt.gca() ax.spines[‘right‘].set_color(‘none‘) ax.spines[‘top‘].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))
之後,我們再標註出(x0,y0)的位置信息,用plt.plot([x0,x0,],[0,y0,],‘k--‘,linewidth=2.5)畫出一條垂直於x軸的虛線
x0=1 y0=2*x0 + 1; plt.plot([x0,x0,],[0,y0,],‘k--‘,linewidth=2.5) plt.scatter([x0, ],[y0, ],s=50,color=‘b‘)
再之後,我們對圖像添加一些註釋,比如我們可以對(x0,y0)這個點添加註釋
plt.annotate(r‘$2x+1=%s$‘ % y0 , xy = (x0,y0) , xycoords=‘data‘ , xytext=(+30,-30) , textcoords=‘offset points‘ , fontsize=16 , arrowprops=dict(arrowstyle=‘->‘,connectionstyle="arc3,rad=.2"))
我們也可以對文本中添加一些需要的註釋
plt.text(-3.7,3,r‘$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$‘, fontdict={‘size‘:16,‘color‘:‘r‘})
其中,-3.7和3是選取在文本中添加註釋的位置,空格需要用到轉字符\,fontdict設置字體。
其中,本部分的全部源碼是:
import matplotlib.pyplot as plt import numpy as np x=np.linspace(-3,3,50) y=2*x + 1 plt.figure(num=1,figsize=(8,5),) plt.plot(x,y,) ax=plt.gca() ax.spines[‘right‘].set_color(‘none‘) ax.spines[‘top‘].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)) x0=1 y0=2*x0 + 1; plt.plot([x0,x0,],[0,y0,],‘k--‘,linewidth=2.5) plt.scatter([x0, ],[y0, ],s=50,color=‘b‘) plt.annotate(r‘$2x+1=%s$‘ % y0 , xy = (x0,y0) , xycoords=‘data‘ , xytext=(+30,-30) , textcoords=‘offset points‘ , fontsize=16 , arrowprops=dict(arrowstyle=‘->‘,connectionstyle="arc3,rad=.2")) plt.text(-3.7,3,r‘$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$‘, fontdict={‘size‘:16,‘color‘:‘r‘}) plt.show()
所產生的圖片是:
tick能見度
當我們生成圖片太多的時候,往往會出現圖片的內容較多,相互掩蓋的情況。我們可以通過設置相關內容的透明度來使圖片更加容易觀察,也即是通過本節中的bbox參數設置來調節圖像信息。
參考之前的例子,我們可以繪制出圖片的基本信息:
import matplotlib.pyplot as plt import numpy as np x=np.linspace(-3,3,50) y=0.1*x plt.figure() plt.plot(x,y,linewidth=10) plt.ylim(-2,2) ax=plt.gca() ax.spines[‘right‘].set_color(‘none‘) ax.spines[‘top‘].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軸和y軸的刻度數字來進行透明度設置
for label in ax.get_xticklabels() + ax.get_yticklabels(): label.set_fontsize(12) label.set_bbox(dict(facecolor=‘white‘,edgecolor=‘None‘,alpha=0.7))
其中,label.set_fontsize(12)用來重新調整字體大小,set_bbox設置目的內容中關於透明度參數,facecolor調節box前景色,edgecolor設置邊框,在本處我們將邊框設置成無,alpha用來設置透明度。
在這一階段,其全部源碼為:
import matplotlib.pyplot as plt import numpy as np x=np.linspace(-3,3,50) y=0.1*x plt.figure() plt.plot(x,y,linewidth=10) plt.ylim(-2,2) ax=plt.gca() ax.spines[‘right‘].set_color(‘none‘) ax.spines[‘top‘].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)) for label in ax.get_xticklabels() + ax.get_yticklabels(): label.set_fontsize(12) label.set_bbox(dict(facecolor=‘white‘,edgecolor=‘None‘,alpha=0.7)) plt.show()
所繪出來的圖片為:
Matplotlib隨記1